2026-08-20
dispatch.cpp
#include <iostream>
struct Base {
virtual void greet(int n = 1) { std::cout << n; }
};
struct Derived : Base {
void greet(int n = 2) override { std::cout << n; }
};
int main() {
Base* b = new Derived();
b->greet();
}
これは何を出力するでしょうか?
答え
1。仮想関数ディスパッチによって実行時にDerived::greetの本体が選ばれます — ここまでは動的です。しかしデフォルト引数の値は静的に、つまりオブジェクトの動的な型ではなく、呼び出しに使われた式の宣言された型に基づいて決まります。bはBase*型なので、実際に実行されるのはDerived::greetであっても、使われるデフォルト値はBaseのもの(n = 1)になります。標準規格で定義された動作であり、非常によく知られた落とし穴です。