【发布时间】:2014-11-13 04:15:44
【问题描述】:
class Foo
{
public:
void f() {}
virtual void g() {}
};
class Bar : public Foo
{
public:
void f() {}
virtual void g() {}
};
int main()
{
Foo foo;
Bar bar;
Foo *a = &bar;
Bar *b = &bar;
// case #1
foo.f();
foo.g();
// case #2
bar.f();
bar.g();
// case #3
a->f();
a->g();
// case #4
b->f();
b->g();
}
据我所知,在第一种和第二种情况下,编译器应该已经知道什么是类型,所以我想没有动态绑定。
但我不确定第三种和第四种情况。在第三种情况下,我认为编译器可以知道类型,如果它有点难以猜测指针指向的位置。所以可能有也可能没有动态绑定。
在第四种情况下,指向派生类对象的派生类指针是否还必须涉及动态绑定?
【问题讨论】:
-
在第四种情况下,如果不能静态确定实际类型,那么可以,动态绑定仍然发生,因为
Bar类可以由另一个类进一步派生。
标签: c++ oop polymorphism dynamic-binding