HM138 纯虚函数抽象类

HM138 纯虚函数抽象类

HM138 纯虚函数抽象类

来源: 第 138 集 类和对象-多态-纯虚函数和抽象类

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

写多态时,基类虚函数里的实现常常用不到:动物例子里并不想听到「动物在说话」,计算器例子里 getResult 返回 \(0\) 也从未被用到。这时应把虚函数改成**纯虚函数**——在 virtual 返回值、函数名、参数列表后面直接写 = 0,不再写函数体。注意:必须先有 virtual,单独写 函数 = 0 不能通过编译。

类里只要出现一个纯虚函数,这个类就叫**抽象类**,有两条硬规则:

  1. 抽象类不能实例化对象,栈上 Base b; 和堆上 new Base 都不行。
  2. 派生类必须重写抽象类里的全部纯虚函数,否则派生类自己也是抽象类,同样不能实例化。写纯虚函数的目的,就是强迫子类去重写,否则多态没有意义。

请定义抽象基类 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 对象并调用 func
  • CALL SON2:用父类指针指向 Son2 对象并调用 func
  • MAKE_BASE:询问栈上实例化抽象类 Base
  • MAKE_HEAP:询问堆上实例化抽象类 Base
  • MAKE_EMPTY:询问实例化未重写纯虚函数的 EmptySon
  • PURE_NEED_VIRTUAL:询问写成纯虚函数时前面要不要 virtual

输出格式

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

  • CALL SONfunction函数调用
  • CALL SON2SON2 function
  • MAKE_BASE MAKE_HEAP MAKE_EMPTYCANNOT
  • PURE_NEED_VIRTUALYES

样例

输入 #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
通过率
?
上传者