我能有一类具有另一个类的(类型为“基地”)的一员,这样在施工,这个“基地”成员实际上将被设置为一个派生类(“BIG”)?
特别是,我想有
class Base{
public:
void dostuff(){};
};
class DerivedA : public Base{
public:
void dostuff(){
//implementation version A
}
};
class DerivedB : public Base{
public:
void dostuff(){
//implementation version B
}
};
class BIG{
Base mything;
BIG(int Type){
if (Type==0)
mything=DerivedA();
if (Type==1)
mything=DerivedB();
}
};
难道c + +不允许这样做。特别是,我将是“向下转换”从基地到DerivedA或DerivedB mything。难道我纠正向下转换只能从基本的指针允许派生指针,只有当基本指针实际上已经是一个指向派生类?
首先,你可能忘了实际上是从Base
派生。但无论如何,多态需要一个指针或引用。否则,分配一个派生类的对象的基类的变量类型将‘切片’的派生类对象,即它会切断的基类对象出派生类对象的:
class Base{
public:
virtual void dostuff(){ cout << "in base" << endl; };
};
class DerivedA : public Base {
public:
virtual void dostuff(){ cout << "in derived" << endl; };
};
int main() {
Base mything = DerivedA(); // slicing, will result in a `Base`-object
mything.dostuff(); // Base class implementation
Base *polymorph = new DerivedA(); // polymorphic; will point to a DerivedA-instance
polymorph->dostuff(); // DerivedA class implementation of dostuff
}
是的,这是可能的,但mything必须是指针或到一个多态对象的引用。如果你把它当作一个普通的对象,你会slicing。
class BIG{
Base *mything;
public:
BIG(int Type){
if (Type==0)
mything = new DerivedA();
else if (Type==1)
mything = new DerivedB();
}
};
当然,这是假设这两个DerivedA
和DerivedB
从Base
公开继承。如果你想正确的dostuff()
函数被调用,你也需要让virtual
(这不是专门针对您的问题,而是要多态类),以及虚拟析构函数。
最后,你需要采取rule of 3的照顾,如果你不想从讨厌的分配/释放错误受苦。因此,一个更方便的备选是使用智能指针代替原始指针,让智能指针照顾拷贝和销毁。
评论:这是一个风格问题,这是无关紧要的这里,但试图利用良好的生活习惯,避免全帽类名;-)