c++ - 虚函数调用非虚函数

标签 c++ inheritance virtual

我写了下面一段代码来测试我对虚拟继承的理解。显然,我仍然没有完全理解它。这是我的代码(后面是我的问题):

#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;
}

这是我的理解:

指针 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

却得到了这个:

In FOO - foo 1
In FOO - foo 2
In BAR - foo 1
In BAR - foo 2

为什么会这样?据我所知,vtable 将只有一个条目用于 foo() 而不是用于 foo2()。那么,如何调用派生类的 foo2() 呢?

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

最佳答案

Bar::foo() 中,您正在调用 foo2()。这实际上等同于调用 this->foo2()this 的类型是 Bar,所以这实际上等同于:

void Bar::foo()
{
    Bar *bar = this;
    bar->foo2();
}

所以此时不​​涉及多态性;该调用在编译时解析为 Bar::foo2,而不是在运行时动态解析。

关于c++ - 虚函数调用非虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796626/

相关文章:

usb - 是否可以模拟USB HID设备(即创建虚拟HID设备)?

c++ - 子类可以内联一个不在基类中内联的纯虚方法吗?

C++当您取消引用指向类对象的指针然后将其作为引用返回时,您可以在此引用上调用方法吗

c++ - 按成员变量的字母顺序对指向对象的指针数组进行排序

c++ - 如何在 Debug模式下使用 Netbeans 编译 Assimp?

javascript - 继承属性中使用的对象字面量会更改该类的所有实例

c++ - Box2D 和过剩。帧率问题

c++ - 无法将父类(super class)转换为子类

java - LinkedHashMap 的子类作为缓存

c++ - 返回不同类型的派生虚函数——指针