HM135 动物说话动态绑定

HM135 动物说话动态绑定

HM135 动物说话动态绑定

来源: 第 135 集 类和对象-多态-多态的基本语法

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

面向对象三大特性里,多态分两类。函数重载、运算符重载属于**静态多态**:函数地址在**编译阶段**就确定(早绑定)。本题要练的是**动态多态**:函数地址在**运行阶段**才确定(晚绑定),由继承加上虚函数实现。

请定义动物基类 Animal,以及公有继承它的 CatDog

  • 基类提供 speak()。普通成员函数时一律输出 动物在说话
  • 把基类 speak() 写成虚函数(前面加 virtual)后,派生类再**重写**同名函数:返回值类型、函数名、参数列表必须完全相同。重写不是重载(重载只要求函数名相同、参数不同)。
  • Cat 重写后输出 小猫在说话Dog 重写后输出 小狗在说话。派生类上的 virtual 可写可不写,不影响动态绑定;基类上必须写。
  • 另写 doSpeak,参数是 Animal 的**引用**(父类引用或指针可以直接指向子类对象,不必强转),内部调用 speak()

动态多态要同时满足:① 有继承关系;② 子类重写父类虚函数。使用时用父类指针或引用指向子类对象。这样传入猫就走猫,传入狗就走狗;若没有 virtual,无论传入什么都早绑定到基类,永远是 动物在说话

读入若干操作。说话类操作必须经由 doSpeak(或与它等价的父类引用/指针调用),不能按单词直接打印。

输入格式

第一行一个整数 \(q\)(\(1 \le q \le 1000\))。

接下来 \(q\) 行,每行一种操作:

  • SPEAK t:\(t\) 为 CATDOGANIMAL。按动态多态调用 doSpeak
  • EARLY t:同样三种动物,但按**没有**虚函数时的早绑定规则调用。
  • REWRITE x y z:判断「返回值 \(x\)、函数名 \(y\)、参数列表 \(z\)」是否构成重写。三个单词各自为 SAMEDIFF
  • CHILD_V:询问子类重写时还要不要再写 virtual

输出格式

每个操作一行,行末换行:

  • SPEAK CAT小猫在说话
  • SPEAK DOG小狗在说话
  • SPEAK ANIMAL动物在说话
  • EARLY 无论哪种动物:动物在说话
  • REWRITE:三个标记全是 SAME 输出 YES,否则 NO
  • CHILD_VOPTIONAL

样例

输入 #1

8
SPEAK CAT
SPEAK DOG
SPEAK ANIMAL
EARLY CAT
EARLY DOG
REWRITE SAME SAME SAME
REWRITE SAME SAME DIFF
CHILD_V

输出 #1

小猫在说话
小狗在说话
动物在说话
动物在说话
动物在说话
YES
NO
OPTIONAL

输入 #2

3
EARLY ANIMAL
REWRITE DIFF SAME SAME
SPEAK CAT

输出 #2

动物在说话
NO
小猫在说话

说明

  • 样例 #1 对应课堂上先早绑定、再加 virtual 后猫狗分别说话的对比。
  • 父类引用可以接收子类对象;没有虚函数时地址早绑定,有虚函数才晚绑定。
  • 重写要求返回值、函数名、参数列表三者都相同;只改参数是重载,不是重写。

信息

ID
1134
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者