HM133 多继承同名二义

HM133 多继承同名二义

HM133 多继承同名二义

来源: 第 133 集 类和对象-继承-继承语法

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

C++ 允许一个类同时继承多个基类:写完第一个「继承方式 + 基类」后,用逗号再写下一组,第三、第四个基类也按同样方式追加。语法形如:

class 派生类 : 继承方式 基类1, 继承方式 基类2, 继承方式 基类3

派生类对象会带上每个基类里的非静态成员,再加上自己的非静态成员。不要用 sizeof 的字节数答题(平台可能补齐),按「有几份非静态成员」理解即可。

请按下面定义,且必须真的写成多继承,不能把数据全塞进一个类:

  • Base1:公有整数 mA
  • Base2:公有整数 mA(与 Base1 同名
  • Base3:公有整数 mE(名字不冲突)
  • Son:公有继承上述三个基类,自己还有公有整数 mCmD

两个基类都有 mA 时,对子类对象直接写 son.mA 会产生**二义性**(不明确:到底是第一个父亲的,还是第二个父亲的)。要看清是哪一份,必须加作用域:son.Base1::mAson.Base2::mA。不冲突的成员(mCmDmE)可以直接访问。

实际开发里不太建议多用继承:不同人写的基类很容易撞名,撞名后每次访问都得加作用域。本题仍要求掌握语法。

读入五份初值和若干询问,按询问输出对应成员或判定。

输入格式

第一行五个整数 \(a_1\)、\(a_2\)、\(c\)、\(d\)、\(e\)(\(1 \le a_1,a_2,c,d,e \le 10^9\)),依次写入 Base1::mABase2::mASon::mCSon::mDBase3::mE

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

接下来 \(q\) 行,每行一个单词:

  • C:直接访问子类自己的 mC
  • D:直接访问子类自己的 mD
  • E:直接访问从 Base3 继承、名字不冲突的 mE
  • B1A:加作用域访问 Base1::mA
  • B2A:加作用域访问 Base2::mA
  • A:询问「不写作用域直接访问 mA」的结果
  • N:输出该对象包含的非静态成员个数

输出格式

每个询问一行,行末换行:

  • C D E B1A B2A:对应整数,必须从多继承对象的成员读出
  • AAMBIGUOUS
  • N5

样例

输入 #1

100 200 300 400 500
7
B1A
B2A
C
D
E
A
N

输出 #1

100
200
300
400
500
AMBIGUOUS
5

输入 #2

1 2 3 4 9
3
A
E
B2A

输出 #2

AMBIGUOUS
9
2

说明

  • 样例 #1 对应课堂上的 \(100/200/300/400\),并补上第三个基类的 \(500\)。
  • N 永远是 \(5\):两份同名的 mA、一份 mE、子类自己的 mCmD。两份 mA 都在对象里,只是直接点名会二义。
  • 不要输出 sizeof 的字节数。
  • mE 可以不写作用域;mA 必须写 Base1::Base2::

信息

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