关于C++继承的二义性

关于C++继承的二义性

天气太热写不下去代码,就翻柜子,找到c++primer翻了一下,好久不看书,记一下翻到的内容,稍微巩固下…
给定下面的类层次,从 VMI 类内部可以限定地访问哪些继承成员?哪些继承成员需要限定?解释你的推理。

class Base {
public:
    bar(int);
protected:
    int ival;
};
class Derived1 : virtual public Base {
public:
    bar(char);
    foo(char);
protected:
    char cval;
};
class Derived2 : virtual public Base {
public:
    foo(int);
protected:
    int ival;
    char cval;
};
class VMI : public Derived1, public Derived2 { };

从这个继承层次看,VMI类内部访问哪些没有二义性,哪些成员有二义性呢?
从VMI类内部可以不加限定地访问继承成员bar和ival:bar在共享基类Base和派生类Derived1中都存在,但特定派生类实例的优先级高于共享基类实例,所以在VMI类内部不加限定地访问bar,则访问到的是Derived1中的bar实例。ival在共享基类Base和派生类Derived2中都存在,同理,在VMI类中不加限定地访问ival,访问到的是Derived2中的ival实例。
继承成员foo和cval需要限定:二者在Derived1和Derived2中都存在,Derived1和Derived2均为Base的派生类,访问优先级相同,所以,如果在VMI类内不加限定地访问foo和cval,则会出现二义性。