虚基类是只有一个拷贝;
作用分辨符(::)的访问方式:基类::成员(参数)/成员
同名隐藏规则:没有虚函数的情况下,派生类中新增的与基类中的函数同名的函数,即使参数个数不同,则基类中的同名函数被覆盖;如果派生类中的多个基类拥有同名成员函数,派生类也新增了同名函数,则基类都被隐藏(这种情况,对派生类的访问用对象名。成员名,对基类的用作用分辨符)。
<一>
#include<iostream>
class B0
{public:
int nV;
void fun(){cout<<"B0"<<endl;}
};
class B1:public B0
{public:
int nV;
void fun(){cout<<"B1"<<endl;}
};
class B2 :public B0
{public:
int nV;
void fun(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{public:
int nV;
void fun(){cout<<"D1"<<endl;}
};
int main()
{D1 d1;
d1.nV=1;
d1.fun();
d1.B1::fun();
d1.B2::fun();
}
其运行结果为D1 B1 B2
<二>这里不能用d1。fun(),这样会产生二义性,必须通过作用分辨符(::)
#include<iostream>
using namespace std;
class B0
{public:
int nV;
void fun(){cout<<"B0"<<endl;}
};
class B1:public B0
{public:
int nV;
void fun(){cout<<"B1"<<endl;}
};
class B2 :public B0
{public:
int nV;
void fun(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
};
int main()
{D1 d1;
d1.B1::fun();
d1.B2::fun();
}
其结果为 :B1 B2
<三>如果B1,B2中没有和B0有同名函数,则其结果又不同了,变成了B0 B0
#include<iostream>
using namespace std;
class B0
{public:
int nV;
void fun(){cout<<"B0"<<endl;}
};
class B1:public B0
{public:
int nV1;
void fun1(){cout<<"B1"<<endl;}
};
class B2 :public B0
{public:
int nV2;
void fun2(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
};
int main()
{D1 d1;
d1.B1::fun();
d1.B2::fun();
}
其结果为B0 B0
<四>如果再<三>的基础上,再加虚基类,则就可以直接的用d1.fun()访问
如果在二的基础上是不行的
#include<iostream>
using namespace std;
class B0
{public:
int nV;
void fun(){cout<<"B0"<<endl;}
};
class B1:virtual public B0
{public:
int nV1;
void fun1(){cout<<"B1"<<endl;}
};
class B2 :virtual public B0
{public:
int nV2;
void fun2(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
};
int main()
{D1 d1;
d1.fun();
}
其结果:B0