Namara

毎日コード。手助けなし。

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の本体が選ばれます — ここまでは動的です。しかしデフォルト引数の値は静的に、つまりオブジェクトの動的な型ではなく、呼び出しに使われた式の宣言された型に基づいて決まります。bBase*型なので、実際に実行されるのはDerived::greetであっても、使われるデフォルト値はBaseのもの(n = 1)になります。標準規格で定義された動作であり、非常によく知られた落とし穴です。