精华内容
下载资源
问答
  • C++菱形继承

    2020-11-08 12:27:43
    菱形继承 菱形继承概念: ​ 两个派生类继承同一个基类 ​ 又有某个类同时继承者两个派生类 ​ 这种继承被称为菱形继承,或者钻石继承 典型的菱形继承案例: 菱形继承问题: 羊继承了动物的数据,驼同样继承了...

    菱形继承

    菱形继承概念

    ​ 两个派生类继承同一个基类

    ​ 又有某个类同时继承者两个派生类

    ​ 这种继承被称为菱形继承,或者钻石继承

    典型的菱形继承案例

    在这里插入图片描述

    菱形继承问题

    1. 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
      
    2. 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。
      

    示例

    class Animal
    {
    public:
    	int m_Age;
    };
    
    //继承前加virtual关键字后,变为虚继承
    //此时公共的父类Animal称为虚基类
    class Sheep : virtual public Animal {};
    class Tuo   : virtual public Animal {};
    class SheepTuo : public Sheep, public Tuo {};
    
    void test01()
    {
    	SheepTuo st;
    	st.Sheep::m_Age = 100;
    	st.Tuo::m_Age = 200;
    
    	cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;
    	cout << "st.Tuo::m_Age = " <<  st.Tuo::m_Age << endl;
    	cout << "st.m_Age = " << st.m_Age << endl;
    }
    
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    总结

    • 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义
    • 利用虚继承可以解决菱形继承问题
    展开全文
  • C++ 菱形继承

    2019-04-21 15:57:01
    C++支持多重继承,也就是菱形继承,它是指两个子类继承了同一个父类,而又有子类同时继承了这两个子类。 #include <iostream> using namespace std; class A { public: A(){cout << "A" << endl...

    C++支持多重继承,也就是菱形继承,它是指两个子类继承了同一个父类,而又有子类同时继承了这两个子类。

    #include <iostream>
    
    using namespace std;
    class A
    {
    public:
        A(){cout << "A" << endl;}
        ~A(){cout << "~A" << endl;}
        int a;
    };
    
    class B:virtual public A
    {
    public:
        B(){cout << "B" << endl;}
        ~B(){cout << "~B" << endl;}
    private:
        int b;
    };
    
    class C:virtual public A
    {
    public:
        C(){cout << "C" << endl;}
        ~C(){cout << "~C" << endl;}
        private:
        int c;
    };
    
    class D:public B,public C
    {
    public:
        D(){cout << "D" << endl;}
        ~D(){cout << "~D" << endl;}
    private:
        int d;
    };
    
    
    int main()
    {
        D d;
        d.B::a = 100;
        cout << d.a << endl;
        cout << d.B::a << endl;
        cout << d.C::a << endl;
    
        d.a = 10;
        cout << d.a << endl;
        cout << d.B::a << endl;
        cout << d.C::a << endl;
    
        return 0;
    }
    
    
    展开全文
  • c++菱形继承

    2020-04-10 09:19:06
    继承关系 父类 子类 classA------------->classB classA------------->classC classD------------->class B,C code: #include <iostream> using namespace std; class A{ public: int dataA...

    类继承关系
    父类 子类
    classA------------->classB
    classA------------->classC
    classD------------->class B,C
    code:

    #include <iostream>
    using namespace std;
    
    class A{
    public:
        int dataA;
    };
    
    class B : public A{
    public:
        int dataB;
    };
    
    class C : public A{
    public:
        int dataC;
    };
    
    class D : public B, public C{
    public:
        int dataD;
    };
    
    int main(){
        cout << " sizeof(class(A)) " << sizeof(A) << endl;
        cout << " sizeof(class(B)) " << sizeof(B) << endl;
        cout << " sizeof(class(C)) " << sizeof(C) << endl;
        cout << " sizeof(class(D)) " << sizeof(D) << endl;
        return 0;
    }
    
    

    结果


    classA------------->classB
    classA------------->classC
    为虚继承时

    #include <iostream>
    using namespace std;
    
    class A{
    public:
        int dataA;
    };
    
    class B : virtual public A{
    public:
        int dataB;
    };
    
    class C : virtual public A{
    public:int
        int dataC;
    };
    
    class D : public B, public C{
    public:
        int c;
    };
    
    int main(){
        cout << " sizeof(class(A)) " << sizeof(A) << endl;
        cout << " sizeof(class(B)) " << sizeof(B) << endl;
        cout << " sizeof(class(C)) " << sizeof(C) << endl;
        cout << " sizeof(class(D)) " << sizeof(D) << endl;
        return 0;
    }
    

    结果
    在这里插入图片描述
    classB和classC分别有两个vptr指向了classA中的dataA,classB和classC中会有额外的虚指针占用空间,64位操作系统大小为8个字节

    详细介绍:
    http://blog.csdn.net/xiejingfa/article/details/48028491

    展开全文
  • C++菱形继承分析

    2018-04-04 22:25:43
    C++菱形继承对象构造部分分析和虚表内存布局,附件包括了源码和二进制文件
  • C++菱形继承原理分析

    2021-01-20 03:34:41
    菱形继承C++继承中是一种复杂的继承关系,存在着二义性和数据冗余的问题,而菱形虚拟继承则是为了解决菱形继承所存在的问题。为了探讨菱形虚拟继承如何解决该问题,我先建立个一个较为简单的菱形继承模型。下面...
  • 什么是菱形继承? 1、菱形继承是多继承关系的一种特殊情况 2、继承关系如下图: (菱形继承关系图) (基于菱形继承关系的对象模型) 3、菱形继承代码: class B { ...

    什么是菱形继承?

    1、菱形继承是多继承关系的一种特殊情况

    2、继承关系如下图:

                                        

                    (菱形继承关系图)                                                       (基于菱形继承关系的对象模型)

    3、菱形继承代码:

    class B
    {
    public:
    	int _b;
    };
    
    class C1 : public B
    {
    public:
    	int _c1;
    };
    
    class C2 : public B
    {
    public:
    	int _c2;
    };
    
    class D : public C1, public C2
    {
    public:
    	int _d;
    };

    分析这段代码,结合上图可以看到:

    C1、C2继承B,且继承权限为public;    D继承C1、C2,且继承方式为public。

    对这段代码进行测试:

    int main()
    {
    	cout << sizeof(D) << endl;
    
    	D d;
    	//d._b = 1; 
    
    	d.C1::_b = 1;
    	d._c1 = 2;
    
    	d.C2::_b = 3;
    	d._c2 = 4;
    
    	d._d = 5;
    	return 0;
    }

    结合菱形继承关系的对象模型,可得派生类D大小为20。和测试结果相符合。

    但是有一个问题

    当我们创建一个D类对象d,再通过d给继承自基类的成员_b赋值时,这里就会报错。

    原因

    _b在派生类D中有两份,一份继承自C1,另一份则来自C2。当我们给_b赋值时,编译器不知道该给哪个_b赋值,则会报错。

    这也是菱形继承的一个缺陷造成数据冗余和二义性问题。

    解决办法

    1、在给存在双份的_b赋值时,前面加上作用域,指出是来自哪个类的_b,则可解决这个问题。例:d. C1::_b = 1;

    2、C++为了解决菱形继承的数据冗余和二义性问题,专门给出了一种解决办法,就是菱形虚拟继承

    下面我们 来了解一下菱形虚拟继承:

    什么是菱形虚拟继承?

    1、专门为解决菱形继承带来的数据冗余和二义性问题而给出的一种继承方式。这种继承方式在除菱形继承之外,通常不会使用。

    2、菱形虚拟继承关系如下图:

                (菱形虚拟继承关系图)                                              

    3、菱形虚拟继承代码:

    class B
    {
    public:
    	int _b;
    };
    
    class C1 : virtual public B
    {
    public:
    	int _c1;
    };
    
    class C2 : virtual public B
    {
    public:
    	int _c2;
    };
    
    class D : public C1, public C2
    {
    public:
    	int _d;
    };

    分析上面这段代码,对比前面菱形继承代码比较:

    不同之处:仅仅是在C1、C2继承B时继承权限前面加上了关键字virtual

    然后对这段代码进行测试:

    cout << sizeof(D) << endl;
    D d;
    d._b = 1;
    d._c1 = 2;
    d._c2 = 3;
    d._d = 4;

    发现:

    1、之前非虚拟继承时存在的数据冗余和二义性问题已经得到了解决,编译器不再报错。

    于是我们猜想菱形虚拟继承的数据模型应该是这样的:

    在派生类D中只有一份_b。所以对应的D类对象大小应该减小为16。

     但是:

    2、派生类D的大小不但没有减小,反而增大为24。

    这是怎么回事呢?

    这里我就直接给出答案了:

    原因:

    菱形虚拟继承为了解决菱形继承所产生的数据冗余和二义性问题,_b 在D中只保留的一份,但是在C1 ,和C2中分别添加了一个指针,目的是为了寻找_b。

    这两个指针都指向一张表,表里存放的是该指针到_b的偏移量,这两个指针叫虚基表指针,这张表叫偏移量表格,也叫虚基表

    通过偏移量可以找到最下面的_b。

    图解:

                             

          (菱形虚拟继承数据模型)                                                                (虚基表数据模型)

     

    总结:

    1、菱形虚拟继承会产生数据冗余和二义性问题。

    2、为解决数据冗余和二义性问题,C++给出菱形虚拟继承专门解决这个问题。

    3、在开发时,不建议设计出多继承,一定不要设计出菱形继承,否则底层实现可能会很复杂,代码性能可能也不是很好。

    展开全文
  • 菱形继承菱形继承C++ 多继承的一种表现形式 用一张简单的图就可以说明什么是菱形继承 2. 菱形继承的问题是什么? 继承最简单的理解就是子类将父类中的成员拷贝了一份。我们用最简单的四个类A,B,C,D有且...
  • C++的继承中有一种复杂的继承方式,这就是菱形继承菱形继承 (1)什么是菱形继承? 假设现在有四个类,分别是A、B、C、D四个类。如果B类和C类同时继承于A类,并且D类又同时继承于B类和C类,那么这四个类之间的...
  • 我的处女博客篇———c++ 菱形继承 1. 什么是菱形继承菱形继承c++的继承中的一种特殊的方式,在菱形继承中,两个子类继承同一个父类,又有某个孙子类同时继承两个子类,这种继承方式就被称为菱形继承,或者叫做...
  • C++菱形继承中的多继承、多重继承、虚继承实例 1.菱形继承:示意图如下 B继承于A,C继承于A,D多重继承于B和C,则创建D类对象时,就会有基类A的两份拷贝。 2.多继承:即一个派生类可以有两个或多个基类。 3.多重继承...
  • C++菱形继承剖析

    2021-02-23 11:37:10
    何为菱形继承?结构如下: 如上图这种菱形形状的继承关系我们称之为菱形继承,这种继承会带来一系列问题,接下来我们在代码中演示。先看如下符合菱形继承的代码: #include <iostream> using namespace ...
  • 单继承&多继承&菱形继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承。 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承(钻石继承)存在二义性和数据冗余问题。 #...
  • C++菱形继承如下: #include<iostream> using namespace std; class A { public: int a; }; class B1 : public A { public: int _B1; }; class B2 :public A { public: int _B2; }; class C :public B1, ...
  • C++菱形继承和虚继承

    2020-03-15 15:27:35
    C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它? 假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C。因为上述图表的形状类似于钻石(或者菱形)...
  • C++ 菱形继承问题

    2020-07-29 21:32:53
    //利用虚继承解决菱形继承,加上virtual关键字,来解决菱形继承问题(子类继承多个父类多个相同数据成员并访问需要加上作用域) class Sheep:virtual public Animal { }; class Tuo:virtual public Animal { }; ...
  • C++菱形继承关系

    2019-01-16 19:27:05
    菱形继承关系 1、菱形继承是什么 答:一个派生类有多个基类,多个基类又由同一个类派生 2、菱形继承有什么问题 答:会让高层的基类在底层的派生类中拥有多份成员,造成不合理 3、菱形继承如何解决 答:利用虚...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,232
精华内容 492
关键字:

c++菱形继承

c++ 订阅