関数のオーバーロードは静的に決まることを知らなくてはまったことがあったのでメモ
class Super { }; class Sub :public Super { }; void Piyo(const Super& super) { cout << "Super" << endl; } //関数のオーバーロード void Piyo(const Sub& sub) { cout << "Sub" << endl; } void main() { unique_ptr<Super> hoge = make_unique<Sub>(); Piyo(*hoge); }
これを実行すると何が表示されるでしょうか?
実行結果は
Super
です。
タイトル通り、関数のオーバーロードは静的に決まるので、hogeはunique_ptr< Super >からSuperとしか解決できません。
もしこういったことがしたい場合はvisiterパターンのような方法がひつようになります。
class Super { public : virtual void piyopiyo() { Piyo(*this); //おい、俺はSuperだぞ } }; class Sub :public Super { public: //関数のオーバーライドも忘れずに void piyopiyo()override { Piyo(*this); //おい、俺はSubやで^^ } }; void Piyo(const Super& super) { cout << "Super" << endl; } //関数のオーバーロード void Piyo(const Sub& sub) { cout << "Sub" << endl; } void main() { unique_ptr<Super> hoge = make_unique<Sub>(); hoge->piyopiyo(); }
これで実行結果は
Sub
となります。
書いていることは全く同じですが、派生classでオーバーライドを忘れないようにしましょう。