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,避免了菱形继承的二义性
网友评论