我写了下面一段代码来测试我对虚拟继承的理解。显然,我仍然没有完全理解它。这是我的代码(后面是我的问题):
#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/