面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。
9.1继承和派生的概念
基类A |
不可被继承部分 |
可被继承部分
|
继承
派生
派生类B |
从基类继承部分
|
自己增加的部分
|
注:
继承箭头由B指向A
类B继承了类A(或者说类B是从类A派生而来的)。类B从类A继承了除构造函数和析构函数之外的所有成员,自己还增加了新的属性与操作。类A称为类B的的基类或父类,类B称为类A的派生类。
9.2继承的实现
9.2.1派生类的定义
定义派生类的一般方式为
Class 派生类名:继承方式 基类1,继承方式 基类2,... ,继承方式 基类n
{
//派生类新增加的成员声明
}
对于单继承情况,派生类的定义可简化为
Class 派生类名:继承方式 基类名
{
//派生类新增成员的声明
}
类族声明代码(保存在头文件shape.h中)
9.2.2派生类的构成
派生类的成员包括继承基类的成员和派生类定义时声明的成员。
派生类自己增加的成员,完成两个需求:修改基类成员和描述新的特征或方法。
派生类修改基类的成员,通过在派生类中声明一个与基类成员同名的新成员来实现。即同名覆盖。
注意:如果在派生类中定义与基类同名的成员函数,则函数名和形参表都要完全相同,否则,就成为重载函数而不是覆盖函数。
9.2.3继承访问控制
C++提供了公有继承(public),私有继承(private)和保护继承(protected)三种方式,不同方式具有不同访问权限,以实现数据的安全性和共享性控制。
1.公有继承
关键字public,具有以下的访问控制特性:①基类的公有成员、保护成员在派生类中仍保持原来的访问属性。
②派生类的成员函数可以访问基类的公有成员和保护成员,不能访问私有成员。
③派生类以外的其他函数可以可以通过派生类的对象访问从基类继承的公有成员。
2.保护继承
Protected是关键字,具有以下访问控制特性:
①基类的公有成员,保护成员在派生类中都变为protected访问属性。
②派生类的成员函数可以访问基类成员的公有成员和保护成员,不能访问基类成员的私有成员。
③派生类以外的其他函数不可以通过派生类的对象访问从基类继承的公有成员。
3.私有继承
Private是关键字,具有以下访问控制特性:
①基类的公有成员、保护成员在派生类中都变为private访问属性。
②派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员。
③派生类以外的其他函数不可以通过派生类的对象访问从基类继承的公有成员。
继承类型 存取方式 |
public |
protected |
private |
public | public | protected | 不可访问 |
protected | protected | protected | 不可访问 |
private | private | private | 不可访问 |
覆盖现象:
#include<iostream>
using namespace std;
class base
{
public:
void function(){
cout<<"function ofclass base"<<endl;
}
};
class deriver:public base{
public:
void function(){
cout<<"function of class deriver"<<endl;
}
};
int main()
{
deriver derobj;
derobj.function();
return 0;
}