我为什么要使用虚拟基类?

Ale*_*lex 4 c++ oop inheritance abstract-class c++11

根据我的阅读,当你有一个包含数据的抽象基类时,会使用虚基类,所以不会复制类,但是,如果不使用虚拟类,复制类有什么问题?

应该避免使用保存数据的抽象基类吗?

举个例子:

class Storable {
public:
  Storable(const string& s);
  virtual void read() = 0;
  virtual void write() = 0;
  virtual ~Storable();
protected:
  string file_name; // store in file named s
  Storable(const Storable&) = delete;
  Storable& operator=(const Storable&) = delete;
};

class Transmitter : public virtual Storable {
public:
  void write() override;
  // ...
};

class Receiver : public virtual Storable {
public:
  void write() override;
 // ...
};

class Radio : public Transmitter, public Receiver {
public:
  void write() override;
  // ...
};
Run Code Online (Sandbox Code Playgroud)

这个例子来自于The C++ Programming Language 4th Edition - Bjarne Stroustrup.

use*_*027 5

为了简短起见,如果你不使用虚拟继承,Storable那么Radio它将继承它两次,一次从Transmitter一次继承Receiver.

这意味着Radio需要2个实例的内存,Storable这是一些内存开销,并且你很可能希望两者都有相同的数据(如果你没有继承它,你必须手动管理它).
此外,当您从Storable(或访问数据成员)调用基类函数时,您要调用哪一个?从Storable那个继承TransmitterStorable那个或从那个继承的那个继承通过Receiver

虚拟继承只需要具有Storable所有继承类共享的基类的单个实例来处理这种情况.

有关虚拟基类的mor信息,这里有一个很好的问题:在C++中,什么是虚拟基类?

  • @Alex:设计问题是它是需要声明继承虚拟的共享库的*immediate*派生类,但它是*派生的*类,它知道它是否会以一种需要的方式使用多重继承虚拟继承以避免重复.因此,如果你希望你的类`Transmitter`以这种方式支持多重继承(或者你认为你可能),那么是的,虚拟地继承.但通常在实践中你不会怀疑,你不想支持它:-) (2认同)