仮想関数というのは、newするときにアップキャスト(?)したときにだけ、効果が発揮されるものという認識は正しいでしょうか?
まずは、コードを示します。
c++
1#include <iostream> 2using namespace std; 3 4#define PRINT(X) (cout << X << endl) 5 6class Parent 7{ 8public: 9 // 関数 10 void sing() { PRINT("parent sing"); } 11 // 仮想関数 12 virtual void v_sing() { PRINT("parent v_sing"); } 13}; 14 15class Child : public Parent 16{ 17public: 18 // 関数をオーバーライド 19 void sing() { PRINT("child sing"); } 20 // 仮想関数をオーバーライド 21 virtual void v_sing() { PRINT("child v_sing"); } 22}; 23 24int main() 25{ 26 Parent parent; 27 parent.sing(); // 関数 28 parent.v_sing(); // 仮想関数 29 30 Child child; 31 child.sing(); // オーバーライドした関数 32 child.v_sing(); // オーバーライドした仮想関数 33 34 // アップキャスト(?)してnewする 35 Parent* p_child = new Child(); 36 // 以下はChildの関数が使われるかと思いきや、Parentの関数が使われる 37 p_child->sing(); // オーバーライドした関数 38 // 仮想関数であれば、Childのものが使われる 39 p_child->v_sing(); // オーバーライドした仮想関数 40 41 return 0; 42}
実行結果を以下に示します。
parent sing parent v_sing child sing child v_sing parent sing child v_sing
newするときに、アップキャスト(?)しない場合(実行結果の上から4行)、virtualを使っても使わなくても違いはないように思えます。
newするときに、アップキャスト(?)した場合(実行結果の下から2行)のみ、virtualを使う意味があるように思えます。
virtualは、アップキャスト(?)してnewしなければ意味がない、という認識は、正しいでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/28 02:03