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()调用派生类?
这是我的第一篇文章.如果我违反任何发布指南,请原谅.提前致谢!
在Bar::foo(),你在打电话foo2().这实际上相当于调用this->foo2().类型this是Bar,所以这实际上相当于:
void Bar::foo()
{
Bar *bar = this;
bar->foo2();
}
Run Code Online (Sandbox Code Playgroud)
所以此时没有涉及多态性; 调用Bar::foo2在编译时解析,而不是在运行时动态解析.