【发布时间】:2014-03-15 21:23:53
【问题描述】:
根据我的阅读,当您有一个包含数据的抽象基类时使用虚拟基类,因此不会复制该类,但是,如果您不使用虚拟类,复制该类有什么问题?
应该避免保存数据的抽象基类吗?
举个例子:
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;
// ...
};
这个例子取自《The C++ Programming Language》一书 第 4 版 - Bjarne Stroustrup。
【问题讨论】:
-
我写重复类的时候,不是这个意义上的,我不会重复代码。
-
问题是您可能希望两个实例的数据相同,这变得难以维护
-
看看钻石继承,例如here.
-
刻薄但基于经验的答案是从不,因为你不应该使用虚拟继承。如果您处于虚拟继承似乎完全必要的情况,那么您可能应该深入重新考虑您的类结构。如果您的两个基类需要一组通用的功能或数据,请改用聚合和依赖注入。
标签: c++ oop inheritance c++11 abstract-class