C++ 虚拟继承(virtual Inheritance)

前言

关于继承有一个总结如下

Access public protected private
Same class obj yes yes yes
Derived classes yes yes no
Outside classes yes no no

三级继承如何访问最上一级

我们都知道继承后的class对象内部其实有关于父类成员所有信息,只不过父类放置于public的成员子类可以访问protected的成员子类也可以访问,但是放置于private的成员子类不可以访问
那么我们如何通过第三级class对象访问爷爷class呢?如下面代码

#include <iostream>

class Base{
    
    

public:
    int base_value = 12;
};

class intermediate1 : public Base{
    
    

public:
    int i = 1;

};

class intermediate2 : public Base{
    
    

public:
    int i = 2;

};

class Derive : public intermediate1, intermediate2{
    
    


};

int main(){
    
    
    Derive d;
    std::cout << d.intermediate1::i << '\n'; 
}

上图中孙子class对象Derive,可以通过d.intermediate1::i去访问父类的public成员,同理因为可以通过父类访问父类成员,那么也可以通过父类访问父类的父类成员,也就是derive的爷爷class,这样访问d.intermediate1::base_value,不过我们要注意base_valueintermediate1intermediate2各有一份副本,所以我们对d.intermediate1::base_value做操作不会影响到d.intermediate2::base_value

虚拟继承

首先要明确的是虚拟继承和虚函数没有关系,还是上述的例子,假设我们想要class intermediate1和class intermediate2共享继承成员变量base_value,也就是说改动intermediate1::base_value相当于改动intermediate2::base_value那么我们可以使用virtual inheritance让class intermediate1和class intermediate2虚拟继承base,此时class intermediate1和class intermediate2通过虚拟继承而来的base的public或者protected的成员变得共享,如下所示

#include <iostream>

class Base{
    
    

public:
    int base_value = 12;
};

class intermediate1 : public virtual Base{
    
    

public:
    int i = 1;

};

class intermediate2 : public virtual Base{
    
    

public:
    int i = 2;

};

class Derive : public intermediate1, intermediate2{
    
    


};

int main(){
    
    
    Derive d;
    ++d.intermediate1::base_value;
    ++d.intermediate1::base_value;

    std::cout << d.intermediate1::base_value << '\n'; 
}

猜你喜欢

转载自blog.csdn.net/qq_37026934/article/details/127990400
今日推荐