首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -多重继承

C++ -多重继承
EN

Stack Overflow用户
提问于 2012-01-31 20:35:06
回答 3查看 206关注 0票数 0

我有一个要求,这将形成钻石恐惧模式。但是我遇到了堆栈溢出伙伴的评论,如果虚拟基类是一个纯粹的抽象类,那么菱形模式就不是那么令人担忧的了。有人能详细解释一下为什么会这样吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-31 20:38:37

C++中的多重继承是一个功能强大但很棘手的工具,如果不小心使用,它通常会导致问题。

下面的文章将教你如何使用虚拟继承来解决程序员遇到的一些常见问题。

Solving the Diamond Problem with Virtual Inheritance

尝试实现dimond如下:文章给出了很好的解释

代码语言:javascript
复制
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;
}
票数 5
EN

Stack Overflow用户

发布于 2012-01-31 20:45:44

我不确定你知道多少关于虚拟继承或钻石图案的知识。简单的答案是,如果继承不是虚的(从菱形的根),那么就有一个V代替菱形,其中完整的类型包含两个独立于的基类副本。虚拟继承基本上是告诉编译器,您只需要完整类型(大多数派生类型)中的基的一个副本,而不管有多少中间类型在它们的继承关系中将该基作为虚的。

当然,这种方法也带来了自己的问题,例如封装被破坏的事实(派生类型必须知道is基础相对于它们的虚拟基础的继承关系,以便调用构造函数),并且虚拟基础上的子对象上的操作将在某种程度上更加复杂和昂贵。

票数 1
EN

Stack Overflow用户

发布于 2012-01-31 20:39:11

请查看此链接- How can I avoid the Diamond of Death when using multiple inheritance?

我相信这些评论会让你对此有一些了解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9079583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档