C++类继承的基本概念
base class,基类、父类
derived class,派生类、子类
C++中的类可以扩展,创建保留基类特征的新类,这个过程称之为继承。类继承也可以描述为:派生类继承基类的成员,并在其上添加自己的成员。
定义C++类继承
两个类的继承关系在派生类中声明,派生类定义使用以下语法:
class derived_class_name: [ACCESS] base_class_name{
/…/
};
其中derived_ass_name是派生类的名称,base_class_name是它所基于的类的名称。
[ACCESS]是继承的最高权限级别符,可以是以下三个值(存取权限级别)的其中之一:
public,公共权限,三级(高)
protected,保护权限,二级
private,私有权限,一级(低)
//举例:
class DerivedClass: public BaseClass{};
派生类继承基类的所有可访问成员,并可自行扩展,举例来说,就是基类BaseClass
包含一个成员x
,派生类DerivedClass
又定义了一个成员y
,那么派生类DerivedClass
则同时包含成员x
和成员y
。
[ACCESS]最高权限级别符是public(公共权限继承),关于[ACCESS]有专文进行讲解,请查看我的博文:C++继承的三种方式。
类继承的基础实例
先创建一个多边形Polygon基类,以Polygon为基类,再创建两个派生类:长方形Rectangle和三角形Triangle。基类Polygon定义了基本属性宽width和高heigt,在派生类中分别定义各自的面积计算方法。
源代码,仔细看其中的注释。
D:\YcjWork\CppTour>vim c2003.cpp
#include <iostream>
using namespace std;
/**
* 类的继承
*/
class Polygon{ //定义一个基类Polygon
//private,私有权限的成员是无法被派生类继承的
protected: //定义保护权限的成员,以便派生类继承
int width, height;
public:
void set_value(int w, int h){
width = w;
height = h;
}
};
class Rectangle: public Polygon{ //定义派生类Rectangle
public:
int area(){
return width*height;
}
};
class Triangle: public Polygon{ //定义派生类Triangle
public:
int area(){
return width*height/2;
}
};
int main(){
Rectangle rect;
Triangle trgl;
rect.set_value(4,5); //调用基类的方法set_value()
trgl.set_value(4,5); //调用基类的方法set_value()
cout << rect.area() << endl; //调用派生类的方法area()
cout << trgl.area() << endl; //调用派生类的方法area()
return 0;
}
派生类Rectangle和Triangle的每个对象都包含从基类Polygon继承的成员,包括:width、height和set_values。派生类Rectangle和Triangle还拥有各自扩展的新成员:area。
用基类Polygon直接创建新对象时,保护权限protected
与私有权限private
修饰的成员没有差别。但使用派生类创建对象时,Polygon基类中protected
修饰的成员才能被继承,而private
修饰的成员则不能被继承。
本例中,通过将width和height声明为protected
而不是private
,这些成员才能在派生类Rectangle和Triangle中访问。而对于公共权限public
的set_values ()函数,则从任何地方都可以访问。
编译运行
D:\YcjWork\CppTour>gpp c2003
D:\YcjWork\CppTour>g++ c2003.cpp -o c2003.exe
D:\YcjWork\CppTour>c2003
20
10
D:\YcjWork\CppTour>
运行截屏
对本类成员的访问权限
不同的函数对本类成员存取权限(Access)的访问情况总结如下:
Access | public | protected | private |
---|---|---|---|
同一类的成员 | yes | yes | yes |
派生类的成员 | yes | yes | no |
非成员 | yes | no | no |
其中“非成员”表示来自本类外的任何访问,如,从main()、另一个类或函数访问。
派生类从基类都继承了什么?
原则上,派生类对public修饰的公共基类的所有成员进行继承,但不会继承基类的以下成员:
- 基类的构造器和解构器
- 基类的赋值操作符
- 基类的友元
- 基类的私有成员
(全文完)