C++继承详解

三种继承

C++有下面三种形式的继承

(1) 公有继承(public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

(2)私有继承(private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

(3)保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

private能够对外部和子类保密,即除了成员所在的类本身可以访问之外,别的都不能直接访问。protected能够对外部保密,但允许子类直接访问这些成员。public、private和protected对成员数据或成员函数的保护程度可以用下表来描述:

示例代码

编译器具体效果

总结

(1)public继承是一个接口继承,保持is - a原则,每个父类可用的成员对子类也可用, 因为每个子类对象也都是一个父类对象。

(2)基类的private成员 在派生类中是不能被访问的, 如果基类成员 不想在类外直接被访问, 但需要 在派生类中能访问, 就定义为protected。 可以看出保护成员限定符是因继承才出现的。
(3) protected / private继承是一个实现继承, 基类的部分成员 并非完全成为子类接口 的一部分, 是 has - a 的关系原则, 所以非特殊情况下不会使用这两种继承关系, 在绝大多数的场景下使用的 都是公有继承。 私有继承以为这is - implemented - in - terms - of(是根据……实现的) 。 通常比组合(composition) 更低级, 但当一个派生类需要访问 基类保护成员 或需要重定义基类的虚函数时它就是合理的。

如果想要用基类的私有成员初始化怎么办?解决方法如下。

如何调用基类私有成员

首先声明一点:类的构造函数和析构函数不能被继承。

所以要用到基类的私有成员初始化必须在派生类中定义一个构造函数并显式调用基类的构造函数

加一个冒号(:),然后加上父类的带参数的构造函数。这样,在子类的构造函数被调用时,系统就会去调用父类的带参数的构造函数去构造对象。应该这样调用(Square继承自Rectangle)

具体实例代码

题目:编程计算图形的面积。程序可计算圆形、长方形、正方形的面积,运行时先提示用户选择图形的类型,然后,对圆形要求用户输入半径值,对长方形要求用户输入长和宽的值,对正方形要求用户输入边长的值,计算出面积的值后将其显示出来。

长方形类设计:

私有变量为:名称、宽度、长度、面积。

成员函数包括:构造函数、信息显示函数、求面积函数。

正方形类设计:

正方形类公有继承自长方形类:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。

正方形类显式调用长方形类的构造函数如下:

私有变量为:名称、边长、面积。

成员函数包括:构造函数、信息显示函数、求面积函数。

网站所有原创代码采用Apache 2.0授权 
网站文章采用知识共享许可协议BY-NC-SA4.0授权

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注