C++学习笔记 —— 继承同名变量于多重继承

继承同名变量解析

如果子类只是继承父类的变量,则在子类中该变量其实只有一个,他的名字可以叫 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继承过来的,
但它们只保留一个副本。因此在子类中实际只有唯一的该变量

所以设计类时避免多重继承

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/111103504