gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:46:39 25 4
gpt4 key购买 nike

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

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com