前言
关于继承有一个总结如下
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_value
在intermediate1
和intermediate2
各有一份副本,所以我们对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';
}