菱形继承-2

菱形继承-3

如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3继承(非虚继承)这样就能解决二义性问题。如果inheritClass_1或inheritClass_2只有一个虚继承baseClass,另一个为普通继承,然后被inheritClass_3继承(非虚继承),只有又会这样呢?代码如下:

#include "iostream"
using namespace std;

class baseClass
{
private:
    int i;
    char c;
public:
    virtual void virt_fun1(){ cout << "baseClass virt_fun1" << endl; }
    virtual void virt_fun2(){ cout << "baseClass virt_fun2" << endl; }
    void comm_fun1(){ cout << "baseClass comm_fun1" << endl; }
    void comm_fun2(){ cout << "baseClass comm_fun2" << endl; }
    baseClass() { cout << "tihs is baseClass" << endl; }
    ~baseClass() { cout << "~~ baseClass" << endl; }
};

class inheritClass_1 : public virtual baseClass
{
private:
    char c;
public:
    virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_1() { cout << "tihs is inheritClass_1" << endl; }
    ~inheritClass_1() { cout << "~~ inheritClass_1" << endl; }
};

class inheritClass_2 : public baseClass
{
private:
    char c;
public:
    virtual void virt_fun2(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_2() { cout << "tihs is inheritClass_2" << endl; }
    ~inheritClass_2() { cout << "~~ inheritClass_2" << endl; }
};

class inheritClass_3 : public inheritClass_1, public inheritClass_2
{
private:
    char c;
public:
    virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun2(){ cout << "inheritClass virt_fun2" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_3() { cout << "tihs is inheritClass_3" << endl; }
    ~inheritClass_3() { cout << "~~ inheritClass_3" << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    inheritClass_3 a;

    return 0;
}

依旧存在二义性,程序执行结果如下:
这里写图片描述
inheritClass_3占用48字节内存,内存分布如下:
这里写图片描述
1:由于inheritClass_1为虚继承,所以inheritClass_1的baseClass位于内存最高位
2:由于inheritClass_2为普通继承,所以inheritClass_2的baseClass位于内存低位
3:由于inheritClass_3同时继承于inheritClass_1和inheritClass_2,所以inheritClass_3内存分布如上

菱形继承-4

如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3继承(非虚继承)这样就能解决二义性问题。如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3同时虚继承,又会如何?

#include "iostream"
using namespace std;

class baseClass
{
private:
    int i;
    char c;
public:
    virtual void virt_fun1(){ cout << "baseClass virt_fun1" << endl; }
    virtual void virt_fun2(){ cout << "baseClass virt_fun2" << endl; }
    void comm_fun1(){ cout << "baseClass comm_fun1" << endl; }
    void comm_fun2(){ cout << "baseClass comm_fun2" << endl; }
    baseClass() { cout << "tihs is baseClass" << endl; }
    ~baseClass() { cout << "~~ baseClass" << endl; }
};

class inheritClass_1 : public virtual baseClass
{
private:
    char c;
public:
    virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_1() { cout << "tihs is inheritClass_1" << endl; }
    ~inheritClass_1() { cout << "~~ inheritClass_1" << endl; }
};

class inheritClass_2 : public virtual baseClass
{
private:
    char c;
public:
    virtual void virt_fun2(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_2() { cout << "tihs is inheritClass_2" << endl; }
    ~inheritClass_2() { cout << "~~ inheritClass_2" << endl; }
};

class inheritClass_3 : public virtual inheritClass_1, public virtual inheritClass_2
{
private:
    char c;
public:
    virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun2(){ cout << "inheritClass virt_fun2" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_3() { cout << "tihs is inheritClass_3" << endl; }
    ~inheritClass_3() { cout << "~~ inheritClass_3" << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    inheritClass_3 a;

    return 0;
}

此时也没有问题,程序运行结果如下:
这里写图片描述
inheritClass_3占用56字节内存,内存分布如下:
这里写图片描述
从内存分布看:
1:由于inheritClass_3虚继承inheritClass_1和inheritClass_2,所以inheritClass_3的成员位于最低地址处
2:疑问,为何baseClass的地址低于inheritClass_1和inheritClass_2呢?

菱形继承-5

如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3虚继承其中一个,又会怎样呢?

#include "iostream"
using namespace std;

class baseClass
{
private:
    int i;
    char c;
public:
    virtual void virt_fun1(){ cout << "baseClass virt_fun1" << endl; }
    virtual void virt_fun2(){ cout << "baseClass virt_fun2" << endl; }
    void comm_fun1(){ cout << "baseClass comm_fun1" << endl; }
    void comm_fun2(){ cout << "baseClass comm_fun2" << endl; }
    baseClass() { cout << "tihs is baseClass" << endl; }
    ~baseClass() { cout << "~~ baseClass" << endl; }
};

class inheritClass_1 : public virtual baseClass
{
private:
    char c;
public:
    virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_1() { cout << "tihs is inheritClass_1" << endl; }
    ~inheritClass_1() { cout << "~~ inheritClass_1" << endl; }
};

class inheritClass_2 : public virtual baseClass
{
private:
    char c;
public:
    virtual void virt_fun2(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_2() { cout << "tihs is inheritClass_2" << endl; }
    ~inheritClass_2() { cout << "~~ inheritClass_2" << endl; }
};

class inheritClass_3 : public virtual inheritClass_1, public inheritClass_2
{
private:
    char c;
public:
    virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
    virtual void virt_fun2(){ cout << "inheritClass virt_fun2" << endl; }
    virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
    inheritClass_3() { cout << "tihs is inheritClass_3" << endl; }
    ~inheritClass_3() { cout << "~~ inheritClass_3" << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    inheritClass_3 a;

    return 0;
}

依旧没有问题,程序执行如下:
这里写图片描述
inheritClass_3占用48字节内存,内存分布如下:
这里写图片描述
从内存分布可以看出:
1:非虚继(inheritClass_2)的地址低于虚继承(inheritClass_1)的地址
2:非虚继承与虚继承同时存在时,派生类的成员(inheritClass_3)位于最高位(非虚继承导致)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值