Skip to content

Latest commit

 

History

History
103 lines (72 loc) · 3.21 KB

File metadata and controls

103 lines (72 loc) · 3.21 KB

TD MOO : C++ / UML

第5/6次课

TD 5– 继承

本次TD的目标:

  • 掌握编写新的简单类(教学示例)
  • 掌握继承和重载机制
  • 实现多态性

准备工作:练习1(以及相关的课程概念)

练习I:类层次结构的建模

绘制以下三个类的UML图(仅在纸上绘制):

类Un(一):

  • 拥有一个private的double类型字段X
  • 一个返回X的GetX函数
  • 一个修改X的SetX函数
  • 一个允许初始化X的构造函数
  • 一个显示X的Affiche函数,显示文本"Un.X = "

类Deux(二):

继承自Un,额外拥有:

  • 一个private的double类型字段Y
  • 一个返回Y的GetY函数
  • 一个修改Y的SetY函数
  • 一个允许初始化X和Y的构造函数
  • 一个显示X和Y的Affiche函数,显示文本"Deux. (X, Y) = "

类Trois(三):

继承自Deux,额外拥有:

  • 一个private的double类型字段Z
  • 一个返回Z的GetZ函数
  • 一个修改Z的SetZ函数
  • 一个允许初始化X、Y和Z的构造函数
  • 一个显示X、Y和Z的Affiche函数,显示文本"Trois.(X, Y, Z)="

练习II:类层次结构的实现

1. 按照练习I的图表实现您的解决方案

2. 在main函数中验证您的三个类的功能

3. 修改/调试您的代码以回答以下问题:

3-a Deux类型的对象能否直接访问字段X?为什么?

3-b 当创建Trois类型的对象时,会执行多少个构造函数?构造函数的执行顺序是什么?您是如何找到执行的构造函数和顺序的?

3-c 当Trois类型的对象被销毁时,析构函数的执行顺序是什么?您是如何找到这个顺序的?

3-d 从Trois对象出发,如何执行Deux类的Affiche函数?如何执行Un类的Affiche函数?

4. 对象指针:

创建一个Trois类型的指针并将其分配给一个Trois对象的空间。即:

Trois *_pt = new Trois(1, 2, 3);
_pt->Affiche(); // 用于以下问题
delete _pt;     // 不要忘记!!!!

4-a 构造函数的数量和执行顺序有变化吗?

4-b 析构函数呢?

4-c 调用的Affiche函数是否是最适合的(显示的值的数量相对于内存中值的数量)?

5. 对象指针的优势和问题:

创建一个Un类型的指针并将其分配给一个Trois对象的空间。即:

Un *_pt = new Trois(1, 2, 3); // 确实如此
_pt->Affiche(); // 用于以下问题
delete _pt;     // 不要忘记!!!!

5-a 构造函数的数量和执行顺序有变化吗?

5-b 析构函数呢?

5-c 调用的Affiche函数是否是最适合的?

5-d 在Affiche函数的声明前加上virtual关键字。现在指令_pt->Affiche()调用的是哪个Affiche函数?

5-e 在Un、Deux和Trois类的析构函数声明前加上virtual关键字。使用虚析构函数时,以下指令使用的析构函数的数量和顺序是什么?

delete _pt;

5-f 找到在层次结构中使用最高类型指针的应用。

6. 与5-d相同的问题,但使用引用:

创建一个Un类型的引用并将其分配给一个Trois对象的空间。即:

Trois tr(5, 4, 3);
Un &_ref = tr;
_ref.Affiche(); // 用于以下问题

7. 总结多态性实现的条件和多态性的优势。