Edu*_*yan 4 c++ inheritance overriding multiple-inheritance virtual-inheritance
请考虑以下代码:
#include <iostream>
class A
{
public:
virtual void f() = 0;
virtual void g() = 0;
};
class B : virtual public A
{
public:
virtual void f()
{
g();
}
};
class C : virtual public A
{
public:
virtual void g()
{
std::cout << "C::g" << std::endl;
}
};
class D : public C, public B
{
};
int main()
{
B* b = new D;
b->f();
}
Run Code Online (Sandbox Code Playgroud)
以下程序的输出是C::g.
编译器如何调用类B的姐妹类的函数?
N3337 10.3/9
[注意:虚函数调用的解释取决于调用它的对象的类型(动态类型),而非虚函数函数调用的解释仅取决于它的类型.表示该对象的指针或引用(静态类型)(5.2.2). - 结束说明]
动态类型是指针确实指向的类型,而不是声明为指向类型的类型.
因此:
D d;
d.g(); //this results in C::g as expected
Run Code Online (Sandbox Code Playgroud)
与:
B* b = new D;
b->g();
Run Code Online (Sandbox Code Playgroud)
并且因为在你的B::f调用内部g()(隐式)调用动态类型为的this指针,调用解析为,即.DD::fC::f
如果你仔细观察,它是(完全)相同的行为,如上面的代码所示,只是b现在隐含了 this.
这是虚函数的重点.