ツッコミをうけて、正しいC++のオーバーライドを学んだ話
昨日投稿した記事がさっそくツッコミをいただき、昨日のうちにタイトルを修正しました。
今日は、間違った部分を修正した話をさらっと書いきたいと思いますねー。
まず、基底クラスClangクラスには virtual が、また派生クラスCppクラスには virtual と override がなかったのが昨日の記事での問題点でした。
読んでいたC++本にあったオーバーライドの解説を鵜呑みにしたがための間違いでしたね。
実際の挙動としては hiding であり、オーバーライドではないと親切なツッコミをTwitterにて頂きました。
ちなみに、どこがまずかったかというと、
class Clang { protected: string name; double ver; public: Clang(); void set(string n, double v); void show(); ← ここの void の前に virtual が必要。 ~Clang(); };
class Cpp : public Clang { public: Cpp(); void set(string s, double v); ← void の前に virtual が、; の前に overrideが必要。 void show(); ← void の前に virtual が、; の前に overrideが必要。 ~Cpp(); };
上記のように、必要な記述が抜けていたわけですねー。
で、これを
class Clang { protected: string name; double ver; public: Clang(); virtual void set(string n, double v) virtual void show(); ~Clang(); };
class Cpp : public Clang { public: Cpp(); virtual void set(string s, double v) override; virtual void show() override; ~Cpp(); };
このように virtual と override を書いてやればOKのようです。
個人的には、C++本の内容を鵜呑みにせず、実際にコードを書いて動かしてみることが良いのではないかと今回の一件で思いましたねー。
今後はC++日本語リファレンスやQiitaのC++記事を読みつつ、実際にコードをかいてこうかと思いますねー。
参考記事:
http://qiita.com/yumetodo/items/f3ceb1a64a1540f85568