class 是否可以包含一个 Base class 作为成员,后者后来专门用于 Derived class?

Can a class contain as a member a Base class which is later specialized to a Derived class?

我可以有一个 class ("BIG"),它有另一个 class 作为成员("Base" 类型),以便在构建时,这个 "Base" 成员实际上将被设置为派生的 class?

我特别想要

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++不允许这样吗。特别是,我会 "Downcasting" 从 Base 神话到 DerivedA 或 DerivedB。我是否正确,仅允许从 Base pointers 到 Derived pointers 向下转换,并且仅当 Base 指针实际上已经是指向 Derived class?

首先,您可能忘记了实际派生自 Base。但无论如何,多态性需要指针或引用。否则,将派生 class 的对象分配给基 class 类型的变量将 "slice" 派生 class 对象,即它将切割基 class 派生出的对象 class 对象:

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



}

是的,这是可能的,但神话必须是指针或对多态对象的引用。如果你将它作为一个普通对象保存,你会得到 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 (这不是针对你的问题,而是针对多态 classes),以及一个虚拟析构函数。

最后,如果您不想遇到令人讨厌的 allocation/deallocation 错误,则需要注意 rule of 3。因此,更方便的替代方法是使用智能指针而不是原始指针,并让智能指针负责复制和销毁。

评论:这是一个风格问题,这里无关紧要,但尽量养成良好的习惯,避免全大写class name ;-)