菜鸟问题,怎样才能让基类调用派生类方法
如题 问题点数:20、回复次数:13Top
1 楼antter(JiangMiao)回复于 2006-03-02 17:41:30 得分 0
virtual functionTop
2 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-02 18:06:40 得分 5
还有就是像ATL/WTL那样...
template<typename _Derived>
class base
{
public:
void fun(){ static_cast<_Derived*>(this)->xxx(); }
};
class X: public base<X>
{
public:
void xxx(){}
};Top
3 楼popy007(Twinsen)回复于 2006-03-02 18:26:40 得分 5
如果是基类中的virtual function,并且派生类也对其进行了override,则
用基类的指针或者引用操纵派生类的指针或引用可以通过自动upcast直接使用派生类。
如果基类中没有派生类的一个函数,而通过基类的指针或者引用操纵派生类的指针或引用,
必须用显示downcast才可以使用,比如:
class Base {};
class Derived : public Base {
public:
void f() { cout << "Derived::f()\n"; }
};
Base* bptr = new Derived;
static_cast<Derived*>(bptr)->f();
或者
((Derived*)(bptr))->f();
否则会得到编译器错误。Top
4 楼zhNKUjw(淡淡的云彩悠悠的游)回复于 2006-03-02 20:20:30 得分 5
可以用dynamic_cast操作符,允许在运行时刻进行类型转换,使程序能在同一个类层次中转换类型,将基类指针转换成派生类指针。
class Base {...};
class Derived : public Base {...};
Base *base;
dynamic_cast< Derived* > base 将基类指针base转化成Derived类型
Top
5 楼zhwang_1999(阳光灿烂)回复于 2006-03-02 21:00:51 得分 0
我觉得一般情况下,用虚函数的方法比较好。Top
6 楼berniechen0123(要不我也起个名)回复于 2006-03-03 09:52:15 得分 0
Base* bptr = new Derived;
这样写不是错的吗?
那将来delete的时候因该怎么处理
delete (Derived *)Base;Top
7 楼popy007(Twinsen)回复于 2006-03-03 10:07:49 得分 3
Base* bptr = new Derived;
这样写不是错的吗?
那将来delete的时候因该怎么处理
delete (Derived *)Base;
====
delete bptr;
有两种可能出现:
1)如果Base::~Base非virtual,那么只调用Base::~Base
2)否则,先调用Derived::~Derived,然后Base::~Base
接着,bptr的空间将会被释放。Top
8 楼popy007(Twinsen)回复于 2006-03-03 10:15:33 得分 2
可以用dynamic_cast操作符,允许在运行时刻进行类型转换,使程序能在同一个类层次中转换类型,将基类指针转换成派生类指针。
class Base {...};
class Derived : public Base {...};
Base *base;
dynamic_cast< Derived* > base 将基类指针base转化成Derived类型
=====
dynamic_cast的使用需要两个条件:
1)类的继承关系被设计成真正多态的,也就是说,基类必须有virtual方法,以
产生vtable机制,因为dynamic_cast依赖于vtable。
2)运行器类型检测(RTTI)机制必须为可用状态,否则dynamic_cast不能通过RTTI来
判别被cast的类的真正归属,如果dynamic_cast的使用者错误的使用了它,会发生
意想不到的后果。如果RTTI没有开启,则dynamic_cast基本等同于static_cast。
不同的编译器对RTTI的默认情况不用,比如vc中需要-GR的编译参数打开RTTI。
因此,
class Base {};
class Derived : public Base {};
这种情况下dynamic_cast是不能够使用的。Top
9 楼fengfeng2003()回复于 2006-03-03 11:51:05 得分 0
好像就是模板模式吧Top
10 楼zly1980(zly1980)回复于 2006-03-03 13:56:04 得分 0
基类调用派生类的方法?好象思维不是很对。Top
11 楼hyigle_love(parker)回复于 2006-03-03 14:18:21 得分 0
路过学习!正在学习C++,关于RTTI就快要接触到了!Top
12 楼pagechen(天外飞来的仙)回复于 2006-03-03 14:25:06 得分 0
面向对象的设计和编程中,最好不要这样做。
如果必须,就定义全局类函数指针。把派生类的某个方法理解为全局方法Top
13 楼berniechen0123(要不我也起个名)回复于 2006-03-03 15:17:54 得分 0
谢谢大家Top




