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++ は contravaraint 戻り値の型をサポートしていないため、f(int) は f(float) をオーバーライドしません。
-ポリモーフィズムは C++ でサポートされているため、d と b の両方が派生クラスの vtable を指す必要があります。
派生クラスの -vtable は、0: f(float)、1: f(int) などです。
質問に対する私の答えは Base::f(float) が2回呼び出されることですが、答えは次のとおりです。
Base::f(float) 派生::f(int)
これはなぜですか?別のポインターから派生クラスにアクセスすると、特定の規則が適用されますか? 私の知る限り、オブジェクトのスライスは、copy-ctor または copy-assignment を使用している場合にのみ発生し、ポインターを使用すると、それらはすべて同じ vtable を指す必要があります。