#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