C++ Primer(第5版) 练习 18.28
练习 18.28 已知存在如下的继承体系,在VMI类的内部哪些继承而来的成员无须前缀限定符就能直接访问?哪些必须有限定符才能访问?说明你的原因。
struct Base{
void bar(int); //默认情况下是公有的
protected:
int ival;
};
struct Derived1: virtual public Base{
void bar(char); //默认情况下是公有的
void foo(char);
protected:
char cval;
};
struct Derived2: virtual public Base{
void foo(int); //默认情况下是公有的
protected:
int ival;
char cval;
};
class VMI: public Derived1, public Derived2 {};
环境:Linux Ubuntu(云服务器)
工具:vim
解释
-
无需限定符即可访问:
方法:bar(int)(来自 Base)、bar(char)(来自 Derived1)、foo(char)(来自 Derived1)、foo(int)(来自 Derived2)。
成员:ival(来自 Base)、cval(来自 Derived1)、cval(来自 Derived2)。 -
必须使用限定符访问:
ival(来自 Derived2):因为 ival 存在于 Base 和 Derived2 中,并且 Derived2 版本隐藏了 Base 版本。要解决这种歧义,需要使用限定符。