继承是c++中一种很重要的概念,它使我们的代码可以进行复用。继承就是在原有类的特性下进行拓展,拓展出自己的特性,增加功能。那么这样所产生的类。称之为派生类。这样就体现了从简单到复杂的认知过程,也呈现了面向对象程序结构层次。


  那么继承到底是什么呢?举一个简单的例子,所有学生都是人,但是所有人都不一定是学生。所有的人都要吃饭,呼吸,睡觉。学生也要做上述的事,但是学生还要学习,而不一定所有的人都要学习。用代码表现出来就是这样:

class Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Studet :public Person
{
public:
	void Study();
};


   Student是子类名,冒号后面的public是继承类型,在后面的就是我们的父类或者叫基类名。

先来说一下这个继承类型。继承类型也就是子类对父类的对象成员的访问权限。也就是说我们在这里可以写public/private/protect。每种有什么不同呢?我的理解是继承类型就是对父类成员的访问权限的上限。比如说像我们上面代码的情况,那么我们对父类对象的成员的访问权限跟父类里面的是一样的,public还是公有,private还是私有不可以在类外访问。那么假如是private继承,我们父类中所有的成员都会是private的类型,不可以在类外访问。


   总体来说,父类的private成员都是不可以在基类外进行访问的,但是假如我们想在派生类里访问父类里面的成员,而且父类里面的成员还是不可以在除了派生类的其他区域进行访问的话,那么我们就将它声明为protect。不管是哪种继承方式,父类中的public和protect成员都是可以在我们的派生类里面进行访问的。


   下面来说一下派生类里面的默认成员函数。和其它类一样,假如我们没有在派生类里面显示的定义那六个默认成员函数的话,编译器依然会帮我们合成默认成员函数。那么调用顺序呢?我们定义了一个派生类之后,系统会首先定义基类的构造函数,之后是派生类中的对象的构造函数,最后才是派生类的构造函数。析构函数调用的顺序是完全相反的。


   那么派生类和基类的作用域是怎么回事呢?他们的作用域是完全不同的两个作用域。假如基类和派生类里面有同名成员,我们要访问基类中的成员要这样(基类::基类成员),通过使用作用域限定符来访问,假如直接写那个同名的成员名会访问派生类中的成员。


   那假如我想把派生类的对象赋值给基类,可以吗?答案是肯定的。但是反过来就不行。我们可以这么来理解。子类中有两部分东西,一部分是父类的特性,一部分是自己的特性。父类中只有的是父类自己的特性。那么我想进行赋值,会发生的事就是,我们把子类中的父类的东西给父类赋值过去,而子类他自己的特性父类根本就不需要,它只读取了父类中有的那一部分。而我们把父类赋值给子类呢?子类就会读取相当于子类大小的那么一块空间,而父类中只有父类的,他后面的空间根本就是不是属于他的,那么子类一进行读取那么肯定要出现错误。那么指针和引用也同理。


   特别说一下,友元关系是不可以进行继承的,基类友元是不可以访问子类的私有和保护成员的。


   还有基类中定义了static成员,那么无论派生了多少个子类,都只有一个static成员。


   最后是单继承,多继承,菱形继承。

   上面所讨论的就是单继承,下面来举一个多继承的例子。

class Men
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Women
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Studet :public Men,public Women
{
public:
	void Study();

};


   这里就是一个多继承,学生既有男生也有女生。


   所谓菱形继承就是这样:

class Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Men:public Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Women:public Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};
class Studet :public Men,public Women
{
public:
	void Study();

};


   男人和女人都是人,学生既有男人也有女人。但是学生类里面就有两份人类的东西,存在了二义性和数据冗余的问题。