C++之菱形继承

2022-10-25  本文已影响0人  二进制人类
class Animal
{
public:
    int data;
};

class horse:public Animal{};

class donkey:public Animal{};

class mule:public horse, public donkey{};

int main(int argc, char *argv[])
{
    mule ob1;
    //菱形继承容易产生数据和方法的二义性
    //cout<<ob1.data<<endl;//err

    //加作用域可以解决
    cout<<"data="<<ob1.horse::data<<endl;
    cout<<"data="<<ob1.donkey::data<<endl;
    return 0;
}

使用虚继承可以让mule只留一份公共祖先的数据

class Animal
{
public:
    int data;
};

//虚继承
class horse: virtual public Animal{};
//虚继承
class donkey:virtual public Animal{};
 //mule只有一份data
class mule: public horse, public donkey{};

int main(int argc, char *argv[])
{
    mule ob1;
    cout<<ob1.data<<endl;
    return 0;
}

虚继承原理

因此在发生虚继承后,马和驴中原先继承下来的age变成了vbptr指针都指向各自的虚函数表,通过各自虚函数表中指针的偏移量找到animal基类中age,避免了菱形继承的二义性

上一篇 下一篇

猜你喜欢

热点阅读