C++关于虚基类的一点儿小问题
程序员文章站
2022-06-08 18:17:25
...
示例代码:
#include <iostream>
using namespace std;
class A{
public :
void f() {
cout << "10";}
};
class B :public virtual A {
public:
void f() {
cout << "100";}
};
class C : public virtual A,public B {};
int main()
{
C c;
c.f();
}
第一次见的时候感觉很疑惑,到底会输出什么。最后输出的结果是
我就纳闷儿了啊,C不也是继承类A了嘛,为什么不是调用了类A的方法
f()而是调用了从类B继承来的方法f()呢??
原来子类从父类继承的成员在子类中还存在,只是访问他们需要加域修饰符 ::,拿本例来说,类B重写了父类的f()方法,那么类B默认的方法f()就是类B重写的那个方法。
默认的方法我指的是直接调用而不用加域修饰符的方法。
但是类B中还是留有从类A继承来的方法的,只是调用它需要类修饰符**::**。
而虚基类保证了派生类的虚基类成员只有一份,也就是说类虽然C继承自B和A,B也继承了A,但是在类C中A的f()函数只留有一份,也就是说C中A::f()函数只有一个,画个各个类包含的函数图就是:
此时类C中默认的方法f()是从类B中继承而来的。得以解答刚开始我的疑惑。