类可以继承和派生,每一个类都可以继承或者进行派生,但是,一个类不仅仅可以派生出一个类。同理,一个类也可以同时继承多个类。
但是有一种较为特殊的情况。当一个父类派生出两个类后,有一个类同时继承了这两个子类,如下:
在这种较为特殊的情况下,在Liger中会存在两份Animal的属性。如若在此时直接调用属性继承于Tiger和Lion中的共同属性就会出现错误。因为Linger中存在两份同样的属性,因此直接调用编译器无法知晓到底要调用哪一个数据,所以可以通过加上类名进行限定的方式来避免编译器报错。如下:
#include <iostream>
using namespace std;
class Animal{
public:
int age;
Animal(){
this->age = 0;
}
};
class Tiger: public Animal{
public:
int tooth;
Tiger(){
this->tooth = 1;
this->age = 1;
}
};
class Lion: public Animal{
public:
int fur;
Lion(){
this->age = 2;
this->fur = 2;
}
};
class Liger: public Tiger, public Lion{
public:
Liger(){
this->tooth = 3;
}
};
int main(){
cout << "sizeof(Animal): " << sizeof(Animal) << endl;
cout << "sizeof(Tiger): " << sizeof(Tiger) << endl;
cout << "sizeof(Lion): " << sizeof(Lion) << endl;
cout << "sizeof(Liger): " << sizeof(Liger) << endl;
Liger liger;
cout << liger.Lion::age << endl;
system("pause");
return 0;
}
但是,只是通过类名限定的方式并没有解决其存在两个同名属性造成的问题,在使用的时候很多的时候也只希望类中存在一份这样的数据,而不是两份。此时,可以采用虚继承的方式来解决问题。因为Lion和Tiger中的相同属性来自Animal,所以只需要通过虚继承的方式来继承Animal类即可。此时的Animal类叫做虚基类,如下:
#include <iostream>
using namespace std;
class Animal{
public:
int age;
Animal(){
this->age = 0;
}
};
class Tiger: virtual public Animal{
public:
int tooth;
Tiger(){
this->tooth = 1;
this->age = 1;
}
};
class Lion: virtual public Animal{
public:
int fur;
Lion(){
this->age = 2;
this->fur = 2;
}
};
class Liger: public Tiger, public Lion{
public:
Liger(){
this->age = 3;
}
};
int main(){
Liger liger;
cout << liger.age << endl;
system("pause");
return 0;
}