1. 继承与派生的定义与实现
1.1 定义
1.1.1 概念
◼ 用已有类定义新类,新类拥有原有类的全部特征
▪ 原有类→基类(父类)
▪ 新类→派生类
◼ 可以多继承(一个派生类有多个基类)和多层派生(多层继承)
1.1.2 特点
新类可以继承原有类的属性和行为,并且可以添加新的属性和行为,或更新原有类的成员
◼ 优点:代码重用
1.2形状类的设计与实现
1.2.1 原思路(在上一篇已经发现了,太麻烦了,,ԾㅂԾ,,)
◼ 存在问题
①成员数据冗余
• CPoint2D center;
• ULONG color;
②成员函数冗余 //会重复好几次
• void Translate(float dx, float dy);
1.2.2 新思路
◼增加形状类(CShape)
1.2.3 基类的设计
■派生矩形类(其他以此类推)
1.3 派生类的特点
◼ 吸收基类成员(把需要重复的操作放到一起)
◼ 添加新成员(根据派生类的需要,增加新的数据成员和成员函数,以描述新的属性和行为。)(放在一起了之后得起个新名字吧~)
1.4 派生类的性质
◼ 继承关系是可以传递的:如类A派生出类B,类B又派生出类C,则类B是 类C的直接基类,类A是类B的直接基类,而类A称为类C的间接基类
◼ 继承关系不允许循环:在派生过程中,不允许类A派生出类B,类B又 派生出类C,而类C又派生出类A
2.继承的方式
2.1 公有继承(public)
2.2 私有继承(private)
2.3 保护继承(Protected)
◼ 基类的公有成员和保护成员被继承后作为派生类的保护成员
◼ 基类的私有成员在派生类中不能被直接访问
◼ 如果将派生类作为新的基类继续派生时,基类成员可以沿继承树继续传播
就只有一个区别。。
2.4 三种继承方式比较
3. 派生类的构造与析构
3.1 定义
3.2 构造与析构的调用顺序
#include <iostream> using namespace std; class memObj //成员类 { int a; public: memObj(int x) { a = x; cout << "Constructing member object " << a << endl; } ~memObj() { cout << "Destructing member object" << a << endl; } }; class base //基类 { memObj obj1; //成员类定义 public: base():obj1(1) //成员类的初始化 { cout << "Constructing base "; } ~base() //析构函数 { cout << "Destructing base "; } }; class derived: public base //继承 { memObj obj2; //成员类 public: derived():obj2(2) { cout << "Constructing derived "; } ~derived() { cout << "Destructing derived "; } }; int main() { derived ob; return 0; }
◼ 首先调用基类成员类构造函数
◼ 然后调用基类构造函数
◼ 再调用派生类成员类的构造函数
◼ 最后调用派生类构造函数
◼ 当派生类对象析构时,各析构函数的调用顺序正好相反