C++---类的继承与派生

1.类的派生

1)定义:
在继承关系里,把被继承的类称为基类(或父类),而通过继承关系定义出新的类称为派生类(或子类)。
2)特性:
派生类不仅可以继承原来类的成员,还可以增加新的成员;
3)继承的一般形式:
比如已经有了一个类

class employee{
    
    
	//....
}

需要class tearcher继承该类;
则有:

class teacher:public employee{
    
    
	//.....
}

4)子类可以重写父类成员方法,要求函数返回类型,函数名,参数列表一致;
code:

#include<stdio.h>
#include<iostream>
using namespace std;

class employee{
    
    //父类 
protected:
	char *name;
	int age;
	char sex;
public:
	//....
	void print(){
    
    //父类中的一个方法 
		cout<<"name:"<<name<<endl;
		cout<<"age:"<<age<<endl;
		cout<<"sex:"<<sex<<endl;
	}
};

class teacher:public employee//子类 继承父类,父类的成员自动被继承 
{
    
    
private:
	char *title;
	//...
public:
	//...		
	void print(){
    
    
		cout<<"name:"<<name<<endl;
		cout<<"age:"<<age<<endl;
		cout<<"sex:"<<sex<<endl;
		cout<<"title:"<<title<<endl;
	}
};

int main(){
    
    
	//... 
	
	
	return 0;
}

2.派生类与基类之间的关系

派生类的定义:

class 派生类名:[继承方式] 基类名

C++类的继承方式:可以private,protected,public方式继承;
不同的继承方式可以使得派生类在继承基类的成员时具有不同的特性。
1.
private继承:
父类的public与protected成员在子类中均变为private;
2.
public继承:
父类中的成员属性到子类中依然不变;
3.
protected继承:
父类中的成员到子类中均变为protected;
4.
不管什么继承,父类的私有成员是不能被继承的!!!体现了数据封装思想;
5.
用class关键字定义的类默认继承方式是private, 而用struct定义的类默认继承方式是public。跟类中默认的访问方式保持一致。记录之。
**
code:

#include<stdio.h>
#include<iostream>

using namespace std;


class Base{
    
    
	private:
		int a,b;
	public:
		int getA(){
    
    
			return a;
		}
};

class Derived:public Base{
    
    
	public:
		int getD(){
    
    //调用父类的public方法; 
			getA();
		}		
};

int main()
{
    
    
	
	//...	
	return 0;
}

3.派生类的构造函数和析构函数

**
1)派生类的构造函数:
在创建派生类的对象时,由于派生类的对象包含了类的数据成员,因此派生类的构造函数初始化其自身定义的数据成员外,还必须对基类中的数据成员进行初始化。也就是说,派生类的构造函数要负责调用基类的构造函数。
2)派生类构造函数一般形式:

派生类构造函数名 (参数列表):基类构造函数名(参数列表){…}

利用初始化列表对基类的数据成员进行初始化。
code:

#include<iostream>

using namespace std;

class Base{
    
    
	int x,y;
public:
	Base(int a,int b){
    
    
		x=a;
		y=b;
		cout<<"construct Base"<<endl;
	}
	~Base(){
    
    
		cout<<"destruct Base"<<endl;
	}
};

class SonClass:public Base{
    
    
		
public:
	SonClass(int z):Base(z,z)
	{
    
    
		cout<<"construct SonClass"<<endl;	
	}	
	~SonClass(){
    
    
		cout<<"destruct SonClass"<<endl;
	}
};

int main()
{
    
    
	SonClass oo(8);
	return 0;
} 

运行结果:

construct Base
construct SonClass
destruct SonClass
destruct Base

1.子类构造函数执行步骤:先执行父类构造函数,再执行自己的构造函数;
2.子类析构函数执行过程:先执行自己的析构函数,再执行父类的析构函数;

这个思想类似于栈,先进后出原则;
**

4.多继承与虚基类

**
1.单继承:
某个派生类只有一个父类,这种形式就是单继承,它的类层次可以表示为一棵树。
2.多继承:
C++中允许一个子类有多个父类,称为多继承,多继承的基类和派生类可以组织成有向图的结构。
(多继承派生类的声明方法和单继承类似,只是在声明时是一个列表);

class 派生类:<派生方式>基类1,<派生方式>基类2,…,<派生方式>基类n
{
//…
}

3.虚基类:
可以解决多继承的一个基类的成员拷贝;
实现方法:
class 派生类:virtual <派生方式> 基类…{
//…
}
code:

#include<iostream>

using namespace std;

class A{
    
    
public:
	int x,y;
};

class B:virtual public A{
    
    
	int z;
};

class C:virtual public A{
    
    
	int a;
};

class D:public B,public C{
    
    
	
};
//D d;此时可以直接使用d.x,不再有二义性! 
int main()
{
    
    
	
	D d;
	cin>>d.x;
	cin>>d.y;
	cout<<"x="<<d.x<<endl;
	cout<<"y="<<d.y<<endl;
	return 0;
}

多继承会导致菱形继承的问题(有二义性),使用虚基类可以解决之!

猜你喜欢

转载自blog.csdn.net/timelessx_x/article/details/114990610