以下のコードで、仮想関数であるfは引数にデフォルト値が設定されています。
Aの派生クラスであるBを指すオブジェクトtestからfを呼び出せば、当然オーバーライドされたfが実行されます。
実行結果では2回ともBが出力され引数を指定した場合正しい返り値が返ってくるですが、問題はデフォルト引数のまま関数を呼び出した時にあります。
Bが実行されたのであればデフォルト引数はn=8となり、返り値は10となるはずです。しかし実行結果では、派生元であるAの仮想関数fのデフォルト引数n=5に2が加算された7が返ってきてしまいました。
なぜこのようなことが起きているのでしょうか。
Cpp
1#include <iostream> 2#include <memory> 3 4struct A { 5 virtual int f(int n = 5) const { std::cout << "A"; return n; } 6}; 7 8struct B : A { 9 int f(int n = 8) const override { std::cout << "B"; return n + 2; } 10}; 11 12int main() { 13 std::unique_ptr<A> test(new B()); 14 15 std::cout << test->f(1) << test->f() << std::endl; // output:B3B7 16}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/08 02:52