调用姐妹类C++的函数

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的姐妹类的函数?

PcA*_*cAF 6

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.

这是虚函数的重点.