一个类可以包含作为成员的基类,它是后来专门到派生类? [关闭]

问题描述 投票:-1回答:2

我能有一类具有另一个类的(类型为“基地”)的一员,这样在施工,这个“基地”成员实际上将被设置为一个派生类(“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。难道我纠正向下转换只能从基本的指针允许派生指针,只有当基本指针实际上已经是一个指向派生类?

c++ polymorphism derived-class base-class
2个回答
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



}

0
投票

是的,这是可能的,但mything必须是指针或到一个多态对象的引用。如果你把它当作一个普通的对象,你会slicing

class BIG{
    Base *mything;

public: 
    BIG(int Type){
        if (Type==0)
           mything = new DerivedA();
        else if (Type==1)
           mything = new DerivedB();
    }
};

当然,这是假设这两个DerivedADerivedBBase公开继承。如果你想正确的dostuff()函数被调用,你也需要让virtual(这不是专门针对您的问题,而是要多态类),以及虚拟析构函数。

最后,你需要采取rule of 3的照顾,如果你不想从讨厌的分配/释放错误受苦。因此,一个更方便的备选是使用智能指针代替原始指针,让智能指针照顾拷贝和销毁。

评论:这是一个风格问题,这是无关紧要的这里,但试图利用良好的生活习惯,避免全帽类名;-)

© www.soinside.com 2019 - 2024. All rights reserved.