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 版本。要解决这种歧义,需要使用限定符。

08-22 10:00