37

C++ コンパイラが仮想関数のパラメーターのデフォルト値を保持する場所を説明できる人はいますか? 子クラスでこれらのパラメーターを変更するのは悪い考えだとわかっていますが、なぜですか? ありがとう。

4

2 に答える 2

51

どこにも保管されていないので、それは悪い考えです。

使用されるデフォルト値は、静的 (コンパイル時) 型で定義された値になります。したがって、オーバーライドで既定のパラメーターを変更するときに、基本クラスのポインターまたは参照を介して関数を呼び出した場合、基本の既定値が使用されます。

#include <iostream>

struct Base
{
    virtual ~Base(){ }
    virtual void foo(int a=0) { std::cout << "base: " << a << std::endl; }
};

struct Derived : public Base
{
    virtual ~Derived() { }
    virtual void foo(int a=1) { std::cout << "derived: " << a << std::endl; }
};

int main()
{
    Base* derived = new Derived();
    derived->foo();    // prints "derived: 0"
    delete derived;
}
于 2013-08-07T14:07:46.367 に答える