HM138 纯虚函数抽象类
HM138 纯虚函数抽象类
来源: 第 138 集 类和对象-多态-纯虚函数和抽象类
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
写多态时,基类虚函数里的实现常常用不到:动物例子里并不想听到「动物在说话」,计算器例子里 getResult 返回 \(0\) 也从未被用到。这时应把虚函数改成**纯虚函数**——在 virtual 返回值、函数名、参数列表后面直接写 = 0,不再写函数体。注意:必须先有 virtual,单独写 函数 = 0 不能通过编译。
类里只要出现一个纯虚函数,这个类就叫**抽象类**,有两条硬规则:
- 抽象类不能实例化对象,栈上
Base b;和堆上new Base都不行。 - 派生类必须重写抽象类里的全部纯虚函数,否则派生类自己也是抽象类,同样不能实例化。写纯虚函数的目的,就是强迫子类去重写,否则多态没有意义。
请定义抽象基类 Base,含纯虚函数 func(),以及两个公有派生类:
Son重写后输出function函数调用Son2重写后输出SON2 function
再提供一个**没有**重写 func 的派生类 EmptySon(它仍是抽象类)。调用时必须用父类指针或引用指向子类对象(例如 Base* p = new Son; 再 p->func()),体现运行时多态:同一个接口,指向的对象不同,走不同实现。
读入若干操作。真正的调用必须走多态接口,不能按单词直接打印。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一种操作:
CALL SON:用父类指针指向Son对象并调用funcCALL SON2:用父类指针指向Son2对象并调用funcMAKE_BASE:询问栈上实例化抽象类BaseMAKE_HEAP:询问堆上实例化抽象类BaseMAKE_EMPTY:询问实例化未重写纯虚函数的EmptySonPURE_NEED_VIRTUAL:询问写成纯虚函数时前面要不要virtual
输出格式
每个操作一行,行末换行:
CALL SON:function函数调用CALL SON2:SON2 functionMAKE_BASEMAKE_HEAPMAKE_EMPTY:CANNOTPURE_NEED_VIRTUAL:YES
样例
输入 #1
6
CALL SON
CALL SON2
MAKE_BASE
MAKE_HEAP
MAKE_EMPTY
PURE_NEED_VIRTUAL
输出 #1
function函数调用
SON2 function
CANNOT
CANNOT
CANNOT
YES
输入 #2
3
MAKE_EMPTY
CALL SON2
CALL SON
输出 #2
CANNOT
SON2 function
function函数调用
说明
- 抽象类无论在栈上还是堆上都不能创建对象。
- 子类漏写重写时,自己也变成抽象类,同样
CANNOT。 = 0必须加在虚函数上;没有virtual的函数 = 0不是纯虚函数。- 父类指针指向不同子类时,调用的是各自重写后的版本。
信息
- ID
- 1137
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者