我可以有一个类(“ BIG”),其中另一个类作为成员(类型为“ Base”),以便在构造时,该“ Base”成员实际上将设置为派生类吗?
我特别想拥有
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。我是否正确,仅当Base指针实际上已经是指向Derived类的指针时,才允许从Base pointers 到Derived 向下转换?
答案 0 :(得分:0)
首先,您可能忘记了实际上从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
}
答案 1 :(得分:0)
是的,这是可能的,但是神话必须是一个指针或对多态对象的引用。如果将其保留为普通对象,则将有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。因此,更方便的替代方法是使用智能指针而不是原始指针,并让智能指针负责复制和销毁。
评论:这是一个与样式无关的问题,但请尝试养成良好的习惯,避免使用全大写的类名;-)