【发布时间】:2012-02-06 11:20:00
【问题描述】:
我写了下面这段代码来测试我对虚拟继承的理解。显然,我仍然没有完全理解它。这是我的代码(后面是我的问题):
#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()是如何被调用的呢?
这是我的第一篇文章。如果我违反了任何发布指南,请原谅。提前致谢!
【问题讨论】:
-
在
b->foo();下方添加对b->foo2()的调用,看看会发生什么。是你所期望的吗? -
是的。这就是我所期望的。感谢答案,我现在明白发生了什么:)
-
注意:您的代码没有虚拟继承。它通常具有来自多态类的单一继承。虚拟继承是
class X : public virtual Y { }; -
谢谢 ybungalobill。我将阅读更多关于这个主题的内容,并更彻底地理解其中的区别。
标签: c++ inheritance virtual