多级继承
多级继承的继承过程,不止一次单继承。
多继承
一个类继承自多个类,叫做多继承。
上图所示的继承关系中可以看到,驴和马都继承自动物类,驴和马共同作用派生除了骡子类。但是在这种派生关系中,在骡子类中出现了二义性的问题,对于从动物类继承来的属性x,在🐎类和驴类中都有相应的属性,但此时,在骡子类中想要访问该属性时,就不知道要访问哪一个x,这是不应该出现的。这是多继承的二义性。
下面这段代码,演示了二义性的产生
#include<iostream>
#include<stdio.h>
class Animal
{
public :
int x;
Animal()
{
printf("Animal 构造\n");
}
~Animal()
{
printf("Animal 析构\n");
}
};
class Horse :public Animal
{
public:
Horse()
{
printf("Horse 构造\n");
}
~Horse()
{
printf("Horse 析构\n");
}
void show_info()
{
printf("Horse------>x is %d\n",x);
}
};
class Donkey :public Animal
{
public:
Donkey()
{
printf("Donkey 构造\n");
}
~Donkey()
{
printf("Donkey 析构\n");
}
void show_info()
{
printf("Donkey------>x is %d\n", x);
}
};
class Mule :public Donkey, public Horse
{
public:
void show_info()
{
printf("Mule(Donkey)------>x is %d\n", this->Donkey::x);
printf("Mule(Horse)------>x is %d\n", this->Horse::x);
}
};
int main()
{
{
Mule M;
M.Donkey::x = 10;
M.show_info();
printf("sizeof x is %d\n", sizeof(M));
}
system("pause");
return 0;
}
从上面的代码可以看出,在Mule类中,按理说应该只有一个x属性,但是由于Mule继承自Horse 和Donkey因此,在Mule类中产生了二义性。
解决这种二义性的办法,可以采用虚继承的方式。
#include<iostream>
#include<stdio.h>
class Animal
{
public :
int x;
Animal()
{
printf("Animal 构造\n");
}
~Animal()
{
printf("Animal 析构\n");
}
};
class Horse :public virtual Animal
{
public:
Horse()
{
printf("Horse 构造\n");
}
~Horse()
{
printf("Horse 析构\n");
}
void show_info()
{
printf("Horse------>x is %d\n",x);
}
};
class Donkey :public virtual Animal
{
public:
Donkey()
{
printf("Donkey 构造\n");
}
~Donkey()
{
printf("Donkey 析构\n");
}
void show_info()
{
printf("Donkey------>x is %d\n", x);
}
};
class Mule :public Donkey, public Horse
{
public:
void show_info()
{
printf("Mule(Donkey)------>x is %d\n", this->Donkey::x);
printf("Mule(Horse)------>x is %d\n", this->Horse::x);
}
};
int main()
{
{
Mule M;
M.Donkey::x = 10;
M.show_info();
printf("sizeof x is %d\n", sizeof(M));
}
system("pause");
return 0;
}