我有一个要求,这将形成钻石恐惧模式。但是我遇到了堆栈溢出伙伴的评论,如果虚拟基类是一个纯粹的抽象类,那么菱形模式就不是那么令人担忧的了。有人能详细解释一下为什么会这样吗?
发布于 2012-01-31 20:38:37
C++中的多重继承是一个功能强大但很棘手的工具,如果不小心使用,它通常会导致问题。
下面的文章将教你如何使用虚拟继承来解决程序员遇到的一些常见问题。
Solving the Diamond Problem with Virtual Inheritance
尝试实现dimond如下:文章给出了很好的解释
class storable
{
public:
storable(const char*);
virtual void read()=0; //this becomes pure virtual making storable an abstract
virtual void write(); //class
virtual ~storable();
private:
....
}
class transmitter: public virtual storable
{
public:
void write()
{
read();
....
}
}
class receiver: public virtual storable
{
public:
void read();
}
class radio: public transmitter, public receiver
{
public:
...
}
int main()
{
radio *rad = new radio();
receiver *r1 = rad;
transmitter *r2 =rad;
rad->write();
r1->write();
r2->write();
return 1;
}发布于 2012-01-31 20:45:44
我不确定你知道多少关于虚拟继承或钻石图案的知识。简单的答案是,如果继承不是虚的(从菱形的根),那么就有一个V代替菱形,其中完整的类型包含两个独立于的基类副本。虚拟继承基本上是告诉编译器,您只需要完整类型(大多数派生类型)中的基的一个副本,而不管有多少中间类型在它们的继承关系中将该基作为虚的。
当然,这种方法也带来了自己的问题,例如封装被破坏的事实(派生类型必须知道is基础相对于它们的虚拟基础的继承关系,以便调用构造函数),并且虚拟基础上的子对象上的操作将在某种程度上更加复杂和昂贵。
发布于 2012-01-31 20:39:11
请查看此链接- How can I avoid the Diamond of Death when using multiple inheritance?
我相信这些评论会让你对此有一些了解。
https://stackoverflow.com/questions/9079583
复制相似问题