一个类是否可以包含一个基础类,该基础类以后专门用于派生类?

时间:2019-02-06 21:19:44

标签: c++ polymorphism derived-class base-class

我可以有一个类(“ 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 向下转换?

2 个答案:

答案 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();
    }
};

当然,这假设DerivedADerivedB都从Base公开继承。如果要调用正确的dostuff()函数,还需要使其成为virtual(这不是特定于您的问题,而是多态类),并具有虚拟析构函数。

最后,如果您不想遭受麻烦的分配/取消分配错误,则需要照顾rule of 3。因此,更方便的替代方法是使用智能指针而不是原始指针,并让智能指针负责复制和销毁。

评论:这是一个与样式无关的问题,但请尝试养成良好的习惯,避免使用全大写的类名;-)