4.1 派生类的概念
4.1.1 继承的使用
(1)已有类称为基类或是父类,产生的新类成为派生类或是子类。
(2)继承可以形成类的结构
(3)目的:提高代码可重用性
4.1.2 派生类的声明
(1)声明派生类的格式:
class 派生类名:[继承方式]基类名{
//派生类新增的数据成员和成员函数
};
其中,继承方式有public、private(系统默认)、protected
4.1.3 派生类的构成
(1)从基类继承成员
(2)增加数据成员和成员函数
(3)构造派生类3个工作步骤:
1)派生类从基类接收成员(除构造函数和析构函数之外)
2)调整从基类接收的成员
> 通过继承方式改变基类成员在派生类中的访问属性
> 覆盖基类的同名函数(函数名相同,参数相同)
4.1.4 基类成员在派生类中的访问属性
基类成员在派生类中的访问属性
基类中的成员 在公有派生类中的访问属性 在私有派生类中的访问属性 在保护派生类中的访问属性 私有成员 不可直接访问 不可直接访问 不可直接访问 公有成员 公有 私有 保护 保护成员 保护 私有 保护
4.1.5 派生类对基类成员的访问
(1)派生类对基类成员的访问形式有
1)内部访问:由派生类中新增的成员函数对基类继承的成员访问
2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问
私有继承的访问规则
基类中的成员 私有成员 公有成员 保护成员
访问方式:内部访问 不可访问 可访问 可访问
访问方式:对象访问 不可访问 不可访问 不可访问
公有继承的访问规则
基类中的成员 私有成员 公有成员 保护成员
访问方式:内部访问 不可访问 可访问 可访问
访问方式:对象访问 不可访问 可访问 不可访问
保护继承的访问规则
基类中的成员 私有成员 公有成员 保护成员
访问方式:内部访问 不可访问 可访问 可访问
访问方式:对象访问 不可访问 不可访问 不可访问
示例:以公有继承的访问规则为例
#include<iostream>
using namespace std;
class Base{
public:
int pub_data; //基类公有数据成员
Base(int pub=0,int pri=0,int pro=0); //基类带默认参数的构造函数
~Base(); //基类构造函数
private:
int pri_data; //基类私有数据成员
protected:
int pro_data; //基类保护数据成员
};
Base::Base(int pub,int pri,int pro){
pub_data=pub;
pri_data=pri;
pro_data=pro;
cout<<"Constructor Base called"<<endl;
}
Base::~Base(){
cout<<"Destructor Base called"<<endl;
}
class Derive:private Base{
public:
Derive(int pub,int pri,int pro):Base(pub,pri,pro){
cout<<"Constructor Derive called"<<endl;
}
~Derive(){
cout<<"Destructor Derive called"<<endl;
}
void set(int pub,int pro){
pub_data=pub;
pro_data=pro;
}
void displaydata(){
cout<<"pub_data = "<<pub_data<<endl;
cout<<"pro_data = "<<pro_data<<endl;
}
/********************* 错误 *********************/
/*** 派生类通过内部访问的方式访问基类中的私有成员***/
// void show_pri_data(){
// cout<<"pri_data = "<<pri_data<<endl;
// }
/********************* 错误 *********************/
};
int main()
{
Derive de(1,2,3);
de.displaydata();
return 0;
}
运行结果:
错误:编译器报错