#include<iostream> using namespace std; class Base { public: Base():ival(100){} void bar(int){ cout<<"Base::bar"<<endl; } protected: int ival; }; class Derived1:virtual public Base { public: void bar(char){ cout<<"Derived1::bar"<<endl; } void foo(char ){ cout<<"Derived1::foo"<<endl; } protected: char cval; }; class Derived2:virtual public Base { public: Derived2():ival(200){} void foo(int ){ cout<<"Derived2::foo"<<endl; } protected: int ival; char cval; }; class VMI:public Derived1,public Derived2{ public: void test() { // foo();//二义性 // cval=9;//二义性 bar(3); cout<<ival<<endl; } }; int main(int argc, char *argv[]) { VMI xx; xx.test(); return 0; }
从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,则会出现二义性。
程序输出为:
原文地址:http://blog.csdn.net/wdkirchhoff/article/details/43497471