【发布时间】:2012-01-27 08:36:17
【问题描述】:
virtual 函数解析发生在指针/引用而不是对象上。现在考虑下面的例子:
struct Base { virtual void foo (); };
struct Derived : Base { void foo (); };
Derived d[2];
Base *p = d;
p[0].foo(); // calls Derived::foo()!
我的看法是这样的:对于任何数组T arr[SIZE];,arr[N] 的类型是T(而不是T&),即arr[N] 是一个对象。如果是这种情况,那么在上面的示例中,p[0] 将调用Base::foo(),因为p[0] 应该解析为一个对象。
但是,这是错误的。有人可以解释一下,为什么 p[0] 解析为 Base& 而 not Base ?是不是因为p[0].foo()等价于(p+0)->foo()?
【问题讨论】:
-
这正是虚函数被发明的原因——所以指向基础对象的指针可以调用派生函数。我不知道你为什么这么惊讶。
标签: c++ arrays object reference virtual-functions