根据我的阅读,当你有一个保存数据的抽象基类时使用虚拟基类,所以类不会被复制,但是,如果你不使用虚拟类,复制类有什么问题?
是否应该避免保存数据的抽象基类?
下面是一个例子:
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/