c++ - 为什么要使用虚拟基类?

标签 c++ oop inheritance c++11 abstract-class

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

是否应该避免保存数据的抽象基类?

下面是一个例子:

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;
  // ...
};

This example was taken from the book The C + + Programming Language 4th Edition - Bjarne Stroustrup.

最佳答案

简而言之,如果您不为 Storable 使用虚拟继承,那么 Radio 将继承它两次,一次来自 Transmitter 和一次来自 Receiver

这意味着 Radio 需要内存用于 Storable 的 2 个实例,这是一些内存开销,您很可能希望两者都具有相同的数据(如果您不实际上,你必须手动管理它)。
此外,当您从 Storable 调用基类函数(或访问数据成员)时,您想调用哪个?来自 Storable 的一个通过 Transmitter 继承,或者来自 Storable 的一个通过 Receiver 继承。 p>

虚拟继承通过所有继承类共享的 Storable 基类的单个实例来解决这个问题。

有关虚拟基类的更多信息,这里有一个很好的问题:In C++, what is a virtual base class?

关于c++ - 为什么要使用虚拟基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21814554/

相关文章:

c++ - C++ 规范是否允许通过传递堆栈帧地址偏移来实现闭包?

c++ - C++11 中引入了哪些重大变化?

php - 带有 OOP 的 libxml 错误处理程序

c++ - 使用空的 for 循环有什么问题吗?

c++ - find_if 中具有多个参数的 Lambda

java - 如何使用 CompareTo 对字母表进行排序

php - 特征中的构造函数定义如何冲突?

c++ - 我可以在基类中重载纯虚方法吗?

css - SASS:在mixin中从父级继承设置变量

inheritance - Doctrine - 继承映射,查询子类