菱形继承解决方案 利用虚继承

操作的时共享的一份数据

sheepTuo内部结构

 vbptr 虚基类指针 v:virtual  b:base p:pointer 

 指向一张 虚基类表

 通过表找到偏移量

 找到共有的数据

菱形继承问题的解决方案--虚基类_ios

 如图:类Sheep和Tuo保留的只是虚函数指针,只有Animal里才有数据

 实例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Animal
{
public:

    int m_Age;
};
//虚基类 Sheep
class Sheep:virtual public Animal
{
};
//虚基类 Tuo
class Tuo: virtual public Animal
{};
class SheepTuo :public Sheep, public Tuo
{
};
void test01()
{
    SheepTuo st;
    st.Sheep::m_Age = 10;
    st.Tuo::m_Age = 20;

    cout << st.Sheep::m_Age << endl;    //20 因为指向的时同一个地址
    cout << st.Tuo::m_Age << endl;  //20
    cout << st.m_Age << endl;   //20 可以直接访问m_Age数据 原因时因为没有二义性了
}
int main()
{
    test01();
    system("Pause");
    return 0;
}

 

结果:

菱形继承问题的解决方案--虚基类_虚基类_02