当派生类与基类中有相同成员时:
对应的基类同名成员被隐藏
①若未特别限定,则通过派生类对象使用的是派生类中的同名成员。
②如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名和作用域操作符(::)来限定。
二义性问题:
如果从不同基类继承了同名成员,但是在派生类中没有定义同名成员,“派生类对象名或引用名.成员名”或“派生类指针->成员名”访问成员就存在二义性问题
解决方法仍然是用类型限定
如何解决二义性与冗余呢?→虚基类
#include<iostream>
using namespace std;
class Base0
{
public:
int var0;
};
class Base1: public Base0
{
public:
int var1;
};
class Base2: public Base0
{
public:
int var2;
};
class Derived: public Base1, public Base2
{
public:
int var;
};
class Text2: public Base1, public Base2
{
public:
Text2(int x): var0(x) {}
void Print() { printf("%d\n", var0); }
private:
int var0;
};
int main(void)
{
Derived d;
d.Base1::var0 = 2;
d.Base2::var0 = 3;
//printf("%d\n", d.var0); 非法,Derived::var0不明确,var0存在二义性
printf("%d\n", d.Base1::var0);
printf("%d\n", d.Base2::var0); //输出结果:2 3
Text2 q(1000);
q.Base1::var0 = 2;
q.Base2::var0 = 3;
q.Print(); //合法,输出1000,因为派生类也定义了var0,所以基类的var0全部被隐藏,这个最多属于冗余问题
printf("%d\n", q.Base1::var0);
printf("%d\n", q.Base2::var0); //输出结果:2 3
return 0;
}