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