C++语言程序化设计——第四次作业
第七章类的继承与派生
一、基础概念
类的继承:是新的类从已有类那里得到已有的特性。从已有类产生新类的过程就是类的派生。
通过类的派生可以建立具有共同关键特征的对象家族,从而实现代码的重用,这种继承和派生的机制对于已有程序的发展和改进,是极为有利的。
派生类的定义语法:
class 派生类名:继承方式 基类名1,继承方式 基类名2,...,继承方式 基类名n { 派生类成员声明; };
注意:一个派生类,可以同时有多个基类,这种情况成为多继承。
一个派生类只有一个直接基类的情况,称为单继承。
继承方式规定了如何访问从基类继承的成员。
派生类成员是指除了从基类继承来的所有成员之外,新增加的数据和函数成员。
派生类的生成过程:
吸收基类成员-->改造基类成员-->添加新的成员
二、访问控制
类的继承方式有public(共有继承)、protected(保护继承)和private(私有继承)三种。
1)公有继承
当类的继承方式为共有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。
在类族之外只能通过派生类的对象访问从基类继承的共有成员,而无论是派生类的成员还是派生类的对象都无法直接访问基类的私有成员。
代码实例:从Point类中派生出新的Rectangle类。
基类Point:
class Point { public: void initP(float x=0, float y=0) { this->x = x; this->y = y; } void Move(float xOff, float yOff) { x += xOff; y += yOff; } float GetX() { return x; } float GetY() { return y; } private: float x, y; };
派生类Rectangle:
class Rectangle :public Point {//派生类定义部分 public: //新增共有成员函数 void initR(float x, float y, float w, float h) { initP(x, y); //调用基类公有成员函数 this->w = w; this->h = h; } float GetH() { return h; } float GetW() { return w; } private: float w, h; //新增私有数据成员 };
2)私有继承
当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。
此时将上述Rectangle函数改为:
class Rectangle :private Point { public: void initR(float x, float y, float w, float h) { initP(x, y); this->w = w; this->h = h; } void move(float xOff, float yOff) { Point::Move(xOff, yOff); } float GetX() const { return Point::GetX(); } float GetY() const { return Point::GetY(); } float GetH() const { return h; } float GetW() const { return w; } private: float w, h; };
则可以在Rectangle中访问Point的私有成员。
3)保护继承
保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。
代码实例:
class A{ protected: int x; };
主函数若是为:
int main(){ A a; a.x=5; }
则会产生错误,A的保护成员是不允许被访问的。