第六章 继承和派生
**大家想一起学习交流的可以加群,QQ:755422568。**
一、继承和派生的基本概念
从一个或多个以前定义的类产生新类的过程称为派生,新类称为派生类。
类的继承是指派生类继承基类的数据成员和成员函数。
当从现有类中派生出新类时,派生类以下变化:
1、增加新的成员。
2、重新定义已有的成员函数。
3、改变基类成员的访问权限。
二、单一继承
(1)、单一继承的一般形式
(2)、派生类的构造函数和析构函数
定义派生类的构造函数一般形式如下:
派生类名 :: 派生类名(参数表0) : 基类名(参数表){
//函数体
}
例子:
#include <iostream>
using namespace std;
class Point{
private:
int x,y;
public:
Point(int a,int b){
x = a;
y = b;
cout << "Point..." << endl;
}
void Showxy(){
cout << "x = " << x << ",y = " << y <<endl;
}
~Point(){
cout << "Delete Point" << endl;
}
};
class Test :: public Point{
private:
int H,W;
public:
Test(int a, int b,int h,int w) :Point(a,b){ //构造函数初始列表
H = h;
W = w;
cout << "Test..." << endl;
};
void Show(){
cout << "H = " << H << ",W = " << W << endl;
}
~Test(){
cout << "Delete Test" << endl;
}
};
void main(){
Test t1(3,4,5,6);
t1.Showxy();
t1.Show();
/**
*输出结果:
*Point... //调用基类构造函数
*Test... //调用派生类构造函数
*x = 3,y = 4 //调用基类成员函数Showxy()
*H = 3,W = 4 //调用派生类成员函数Show()
*Delete Test //调用派生类析构函数
*Delete Point //调用基类析构函数
*/
}
(3)、类的保护成员
使用公有方式产生的派生类的成员函数可以直接访问基类中定义的或从另一个基类继承来的公有成员,但不能访问基类的私有成员。
(4)、访问权限和赋值兼容规则
公有派生情况下,基类成员的访问权限在派生类中保持不变。
1、基类的公有成员在派生类中仍然是公有的。
2、基类的保护成员在派生类中仍然是保护的。
3、基类的不可访问的和私有的成员在派生类中仍然是不可访问的。
派生类一般都使用公有继承。
1)、私有派生
通过私有派生,基类的私有和不可访问成员在派生类中是不可访问的,而公有和保护成员就成了派生类的私有成员,其对象不能访问继承的基类成员。
注意:静态成员可以被继承,这时基类对象和派生类对象共享该静态成员。
2)、is-a和has-a的区别
前者属于继承和派生问题,后者是一个类使用另一个类的问题,即把一个类的对象作为自己的数据成员或者成员函数的参数。
3)、保护派生
派生使原来的权限都降一级使用,即private变为不可访问;
protected变为private;public变为protected;
限制了数据成员和成员函数的访问权限,用的少。
三、多重继承
四、二义性及其支配规则
对基类的访问必须是无二义性的,如果可以访问多个基类的成员,则这种对基类成员的访问就是不确定的,称这种访问具有二义性。