EffectiveC++改訂2版 14項〜第16項

第14項

継承で利用する基底クラスの仮想デストラクタの話。AcceleratedC++でもおなじみ。

第15項

代入演算子。これもAcceleratedC++でおなじみ。
よくある間違い

  • operator= の戻り値を void にする
  • operator= の戻り値を const オブジェクトのリファレンスにする

代入演算子を定義するときは、常に *this のリファレンスを戻すこと。

第16項

派生クラスでの代入演算子の定義の方法。AcceleratedC++では単独クラスのみだったので、このケースについては初めて。派生クラスで基底クラスの operater=() を呼び出す。

class Derived: public Base {
    Derived& operator=(const Derived& rhs) {
        if (this != &rhs) {
            Base::operator=(rhs);
            y = rhs.y;
        }
        return *this;
    }
}

また、コピーコンストラクタでも初期化リストで基底クラスの初期値を指定すればよい。

class Derived: public Base {
    Derived(const Derived& rhs): Base(rhs), y(rhs.y) { }
}