虚函数调用非虚函数

Vin*_*nay 3 c++ virtual inheritance

我编写了以下代码来测试我对虚拟继承的理解.显然,我仍然没有完全得到它.这是我的代码(后跟我的问题):

#include <iostream>
#include <vector>

using namespace std;

class Foo
{
public:
    virtual void foo();
    void foo2();
};

void Foo::foo()
{
    cout << "In FOO - foo 1" << endl;
    foo2();
}

void Foo::foo2()
{
    cout << "In FOO - foo 2" << endl;
}

class Bar : public Foo
{
public:
    void foo();
    void foo2();
};

void Bar::foo()
{
    cout << "In BAR - foo 1" << endl;
    foo2();
}

void Bar::foo2()
{
    cout << "In BAR - foo 2" << endl;
}

int main()
{
    Foo* f = new Foo;
    f->foo();

    Foo* b = new Bar;
    b->foo();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的理解:

指针F积分基类Foo和f->foo()调用foo()在基类,后者又调用foo2()中的基类.

指针b是基类指针,但指向派生类Bar的对象.现在,因为它foo()是一个虚函数,所以它调用foo()派生类.现在foo()(派生类)调用foo2().由于foo2()不是虚函数,我期待基类foo2()被调用.但是我看到foo2()派生类被调用了.

所以,我期待这个输出:

In FOO - foo 1
In FOO - foo 2
In BAR - foo 1
In FOO - foo 2
Run Code Online (Sandbox Code Playgroud)

但得到了这个:

In FOO - foo 1
In FOO - foo 2
In BAR - foo 1
In BAR - foo 2
Run Code Online (Sandbox Code Playgroud)

为什么会这样?根据我的理解,vtable将只有一个条目foo()而不是foo2().那么,如何foo2()调用派生类?

这是我的第一篇文章.如果我违反任何发布指南,请原谅.提前致谢!

Oli*_*rth 9

Bar::foo(),你在打电话foo2().这实际上相当于调用this->foo2().类型thisBar,所以这实际上相当于:

void Bar::foo()
{
    Bar *bar = this;
    bar->foo2();
}
Run Code Online (Sandbox Code Playgroud)

所以此时没有涉及多态性; 调用Bar::foo2在编译时解析,而不是在运行时动态解析.