HM135 动物说话动态绑定
HM135 动物说话动态绑定
来源: 第 135 集 类和对象-多态-多态的基本语法
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
面向对象三大特性里,多态分两类。函数重载、运算符重载属于**静态多态**:函数地址在**编译阶段**就确定(早绑定)。本题要练的是**动态多态**:函数地址在**运行阶段**才确定(晚绑定),由继承加上虚函数实现。
请定义动物基类 Animal,以及公有继承它的 Cat、Dog:
- 基类提供
speak()。普通成员函数时一律输出动物在说话。 - 把基类
speak()写成虚函数(前面加virtual)后,派生类再**重写**同名函数:返回值类型、函数名、参数列表必须完全相同。重写不是重载(重载只要求函数名相同、参数不同)。 Cat重写后输出小猫在说话,Dog重写后输出小狗在说话。派生类上的virtual可写可不写,不影响动态绑定;基类上必须写。- 另写
doSpeak,参数是Animal的**引用**(父类引用或指针可以直接指向子类对象,不必强转),内部调用speak()。
动态多态要同时满足:① 有继承关系;② 子类重写父类虚函数。使用时用父类指针或引用指向子类对象。这样传入猫就走猫,传入狗就走狗;若没有 virtual,无论传入什么都早绑定到基类,永远是 动物在说话。
读入若干操作。说话类操作必须经由 doSpeak(或与它等价的父类引用/指针调用),不能按单词直接打印。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一种操作:
SPEAK t:\(t\) 为CAT、DOG或ANIMAL。按动态多态调用doSpeak。EARLY t:同样三种动物,但按**没有**虚函数时的早绑定规则调用。REWRITE x y z:判断「返回值 \(x\)、函数名 \(y\)、参数列表 \(z\)」是否构成重写。三个单词各自为SAME或DIFF。CHILD_V:询问子类重写时还要不要再写virtual。
输出格式
每个操作一行,行末换行:
SPEAK CAT:小猫在说话SPEAK DOG:小狗在说话SPEAK ANIMAL:动物在说话EARLY无论哪种动物:动物在说话REWRITE:三个标记全是SAME输出YES,否则NOCHILD_V:OPTIONAL
样例
输入 #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
- 通过率
- ?
- 上传者