继承同名变量解析
如果子类只是继承父类的变量,则在子类中该变量其实只有一个,他的名字可以叫 d.A::n d.B::n 或 d.n,他们三个都是一个人
class A
{
public:
int n;
};
class B: public A {
};
class D: public B {
};
int main()
{
D d;
d.A::n = 10;
d.B::n = 20;
d.n = 30;
cout<< d.n << ", "<< d.B::n << ", " << d.n<< endl; //30,30,30
}
如果子类中重新定义了父类继承来的变量,那么子类中其实存在父类变量,也就是如下中D中存在三个变量,分别对应三个值
class A
{
public:
int n;
};
class B: public A {
public:
int n;
};
class D: public B {
public:
int n;
};
int main()
{
D d;
d.A::n = 10;
d.B::n = 20;
d.n = 30;
cout<< d.A::n << ", "<< d.B::n << ", " << d.n<< endl;//10,20,30
}
函数继承同上
多重继承问题
子类继承父类变量,多重继承
class A
{
public:
int n;
};
class B: public A {
};
class C: public A {
};
class D: public B ,public C{
};
int main()
{
D d;
//d.n = 1;//直接拿n会报错,因为这里存在二义性,不知道是从B拿来的还是从C拿来的
//d.A::n = 4; //这里会报错,因为是多重继承,所以这里的A会产生歧义,不知道是从B拿来的A还是从C拿来的A
d.B::n = 10; //这里就可以,因为明确说明n
d.C::n = 20;
}
使用虚基类解决多继承问题
class A
{
public:
int n;
};
class B: virtual public A {
};
class C: virtual public A {
};
class D: public B ,public C{
};
int main()
{
D d;
//d.n = 1; //可以拿到
//d.A::n = 4; //可以拿到,只有一个n
d.B::n = 10;
d.C::n = 20;
cout << d.A::n;
}
它的被继承成员在派生类中只保留一个实例。从类 D这个角度上来看,它是从类B与类C继承过来的,而类B C又是从类A继承过来的,
但它们只保留一个副本。因此在子类中实际只有唯一的该变量
所以设计类时避免多重继承