【发布时间】:2014-11-08 03:29:32
【问题描述】:
class Base {
public:
virtual void f(float) { cout << "Base::f(float)\n"; }
};
class Derived : public Base {
public:
virtual void f(int) { cout << "Derived::f(int)\n"; }
};
int main() {
Derived *d = new Derived();
Base *b = d;
b->f(3.14F);
d->f(3.14F);
}
-C++ 不支持逆变返回类型,所以 f(int) 不会覆盖 f(float)
-C++ 支持多态,因此 d 和 b 都应该指向派生类的 vtable。
-vtable 派生类类似于 0: f(float), 1: f(int) etc.
我对这个问题的回答是 Base::f(float) 被调用了两次,但答案是:
Base::f(float) Derived::f(int)
为什么会这样?从不同的指针访问派生类是否强制执行某些规则?据我所知,对象切片仅在使用 copy-ctor 或 copy-assignment 时发生,带有指针,它们都应该指向同一个 vtable。
【问题讨论】:
标签: c++ polymorphism object-slicing