C++类的多重继承、虚继承

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;
}

结果图:
ChineseMan
程序中定义了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;
}

结果图:
People
上述代码在定义China、Man类时,使用了关键字virtual从基类People派生而来。
那么,在创建Person类的对象p时,p先调用基类的基类People的 构造函数,然后调用China类的构造函数,这里China类虽为People类的派生类,但是将不再调用People类的构造函数,Man类同理不再调用People类的构造函数,这样就避免了创建Person类新对象时存在多个People类的复制。

在程序开发过程中,多重继承虽然带来了很多方便,但是很少有人愿意使用,因为它会带来很多复杂的二义性问题,并且它能够完成的功能通过单继承同样可以实现。如今流行的C#、Delphi、Java等面向对象编程的语言没有提供多重继承的功能而只采用单继承,这是经过设计者充分考虑的,因此,读者在开发应用程序时,如果能够使用单继承实现,尽量不要使用多重继承

发布了16 篇原创文章 · 获赞 30 · 访问量 2048

猜你喜欢

转载自blog.csdn.net/zhaizhaizhaiaaa/article/details/104077822