メインコンテンツ

基底クラスの代入演算子が呼び出されていません

コピー代入演算子が、基底サブオブジェクトのコピー代入演算子を呼び出さない

説明

この欠陥は、派生クラスのコピー代入演算子が、その基底クラスのコピー代入演算子を呼び出さなかった場合に発生します。

リスク

この欠陥が発生すると、基底クラスのデータ メンバーを派生クラスの代入演算子で明示的に初期化しない限り、演算子は、基底クラスの既定のコンストラクターを使用してメンバーを暗黙的に初期化します。したがって、基底クラスのデータ メンバーに正しい値が代入されなくなる可能性があります。

ユーザー クラスで、代入演算子により 2 つのオブジェクト間で完全な代入が実行されると予想される場合、想定外の結果となる可能性があります。

修正方法

派生クラスのコピー代入演算子から、基底クラスのコピー代入演算子を呼び出します。

基底クラスのデータ メンバーが private ではなく、基底クラスのデータ メンバーを派生クラスのコピー代入演算子で明示的に初期化する場合でも、この明示的な初期化を、基底クラスのコピー代入演算子の呼び出しで置き換えます。それ以外の場合は、明示的な初期化を保持する理由を決定します。

すべて展開する

class Base0 {
public:
    Base0();
    virtual ~Base0();
    Base0& operator=(const Base0&);
private:
    int _i;
};

class Base1 {
public:
    Base1();
    virtual ~Base1();
    Base1& operator=(const Base1&);
private:
    int _i;
};

class Derived: public Base0, Base1 {
public:
    Derived();
    ~Derived();
    Derived& operator=(const Derived& d) {
        if (&d == this) return *this;
        Base0::operator=(d);
        _j = d._j;
        return *this;
    }
private:
    int _j;
};

この例では、クラス Derived が 2 つのクラス、Base0 および Base1 から派生しています。Derived のコピー代入演算子では、Base0 のコピー代入演算子のみが呼び出されます。Base1 のコピー代入演算子は呼び出されません。

欠陥は、派生クラスのコピー代入演算子に表示されます。ソース コード内での移動のヒントを以下に示します。

  • 派生クラス定義を検索するには、派生クラス名を右クリックして [定義に移動] を選択します。

  • 基底クラス定義を検索するには、まず派生クラス定義に移動します。派生クラス定義において基底クラス名を右クリックし、[定義に移動] を選択します。

  • 基底クラスのコピー代入演算子の定義を検索するには、まず派生クラス定義に移動します。基底クラス定義において演算子名を右クリックし、[定義に移動] を選択します。

修正 — 基底クラスのコピー代入演算子を呼び出す

コピー代入演算子で完全な代入が実行されるようにする 1 つの修正方法は、クラス Base1 のコピー代入演算子を呼び出すことです。

class Base0 {
public:
    Base0();
    virtual ~Base0();
    Base0& operator=(const Base0&);
private:
    int _i;
};

class Base1 {
public:
    Base1();
    virtual ~Base1();
    Base1& operator=(const Base1&);
private:
    int _i;
};

class Derived: public Base0, Base1 {
public:
    Derived();
    ~Derived();
    Derived& operator=(const Derived& d) {
        if (&d == this) return *this;
        Base0::operator=(d);
        Base1::operator=(d);
        _j = d._j;
        return *this;
    }
private:
    int _j;
};

結果情報

グループ: オブジェクト指向
言語: C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: MISSING_BASE_ASSIGN_OP_CALL
影響度: High

バージョン履歴

R2015b で導入