欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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++关于虚基类的一点儿小问题
我就纳闷儿了啊,C不也是继承类A了嘛,为什么不是调用了类A的方法
f()而是调用了从类B继承来的方法f()呢??
原来子类从父类继承的成员在子类中还存在,只是访问他们需要加域修饰符 ::,拿本例来说,类B重写了父类的f()方法,那么类B默认的方法f()就是类B重写的那个方法。
默认的方法我指的是直接调用而不用加域修饰符的方法。
C++关于虚基类的一点儿小问题

但是类B中还是留有从类A继承来的方法的,只是调用它需要类修饰符**::**。
C++关于虚基类的一点儿小问题

而虚基类保证了派生类的虚基类成员只有一份,也就是说类虽然C继承自B和A,B也继承了A,但是在类C中A的f()函数只留有一份,也就是说C中A::f()函数只有一个,画个各个类包含的函数图就是:C++关于虚基类的一点儿小问题

此时类C中默认的方法f()是从类B中继承而来的。得以解答刚开始我的疑惑。

相关标签: C++ 虚基类