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) 等。
我对这个问题的回答是 Base::f(float) 被调用了两次,但答案是:
基数::f(float) 派生::f(int)
为什么会这样?从不同的指针访问派生类是否强制执行某些规则?据我所知,对象切片仅在使用 copy-ctor 或 copy-assignment 时发生,带有指针,它们都应该指向同一个 vtable。