请看如下代码
#include <iostream>// 基类
class Base {
public:virtual void foo() { std::cout << "Base::foo()" << std::endl; }virtual void bar() { std::cout << "Base::bar()" << std::endl; }
};// 虚拟继承的中间类
class A : virtual public Base {
public://virtual void foo() override { std::cout << "A::foo()" << std::endl; }
};class B : virtual public Base {
public://virtual void foo() override { std::cout << "B::foo()" << std::endl; }
};// 派生类
class Derived : public A ,public B {
public://virtual void foo() override { std::cout << "Derived::foo()" << std::endl; }//virtual void bar() override { std::cout << "Derived::bar()" << std::endl; }
};int main() {Base b;A a;Derived d;b.foo();a.foo();d.foo();b.bar();a.bar();d.bar();return 0;
}
由于子类都没有对父类进行重写,因此A,B,Driverd的虚函数表都是相同的,都继承自Base,如图
此时,若A对foo进行重写,D的foo会继承谁的虚表呢。根据我的测试结果得知,此时D会继承A的虚表。同理,若B对foo进行重写,D会继承自B的虚表。也就是谁重写了就继承谁的。那么如果A和B同时对foo进行重写呢,测试结果如下:
编译器会直接报错,因为此时foo的访问不明确,编译器要求你的Derived类要对foo进行重写。