C++类的多重继承
C++语言允许子类从多个父类继承公有的和受保护的成员,这被称为多重继承。
多重继承是指有多个基类名标识符,其声明形式如下:
class 派生类名:[继承方式] 基类名,....[继承方式] 基类名{
....
};
例如,目前有三个类:中国人、男人、中国的男人。那么在定义中国的男人时,就可以把中国人、男人同时作为基类。
#include<iostream>
using namespace std;
class China{
public:
China(){
cout<<"I'm a Chinese."<<endl;
}
};
class Man{
public:
Man(){
cout<<"I'm a man."<<endl;
}
};
class Person:public China,public Man{
public:
Person(){
cout<<"I'm a Chinese man."<<endl;
}
};
int main(){
Person p;
return 0;
}
结果图:
程序中定义了China类、Man类,然后从这两类中派生出了子类Person,Person自然继承了China、Man类的所有公有和受保护的成员,因此在创建Person类的对象p时,p自然调用了China、Man、Person类的构造函数。
那么问题来了!
Person继承China、Man类的所有公有和受保护的成员,若China、Man均派生于同一个基类,如People类,那么当China、Man派生一个新类Person时,Person类中将存在两个People类的复制。能否在派生Person类时,使其只存在一个People类?
C++类的虚继承
C++语言提供了虚继承的机制。
如下:
#include<iostream>
using namespace std;
class People{
public:
People(){
cout<<"I'm a people"<<endl;
}
};
class China:virtual public People{//从People类虚继承China类
public:
China(){
cout<<"I'm a Chinese."<<endl;
}
};
class Man:virtual public People{//从People类虚继承Man类
public:
Man(){
cout<<"I'm a man."<<endl;
}
};
class Person:public China,public Man{
public:
Person(){
cout<<"I'm a Chinese man."<<endl;
}
};
int main(){
Person p;
return 0;
}
结果图:
上述代码在定义China、Man类时,使用了关键字virtual从基类People派生而来。
那么,在创建Person类的对象p时,p先调用基类的基类People的 构造函数,然后调用China类的构造函数,这里China类虽为People类的派生类,但是将不再调用People类的构造函数,Man类同理不再调用People类的构造函数,这样就避免了创建Person类新对象时存在多个People类的复制。
在程序开发过程中,多重继承虽然带来了很多方便,但是很少有人愿意使用,因为它会带来很多复杂的二义性问题,并且它能够完成的功能通过单继承同样可以实现。如今流行的C#、Delphi、Java等面向对象编程的语言没有提供多重继承的功能而只采用单继承,这是经过设计者充分考虑的,因此,读者在开发应用程序时,如果能够使用单继承实现,尽量不要使用多重继承。