fullmated's blog

技術系や考え事、進捗などなど

Effective C++ #9

最近C++に触る機会があって勉強がてらにEffective C++をつまみ食いすることにしました。本に書いてあったことを自分なりに改変してみたのでそのメモ書き。

仮想関数をコンストラクタまたはデストラクタに書くと未定義動作を起こしてしまう。次のコードは実行時エラーを起こす。

なぜかというと、Derivedのコンストラクタ呼び出し時ではまだBaseのインスタンスのみが生成された状態のため、Derivedの情報に一切触れることができないためである。

解決策は、log()を仮想関数とすることをやめて普通のメンバ関数にし、派生クラスから情報を受け取れるようにするというものである。void log(const Info& userInfo)という感じで引数に情報クラスInfoを与えることで、仮想関数の実装を回避している。それが次のコード。