c++ - 自己代入 - ムーブ代入演算子




代入演算子の継承 (4)

「使用する」を使用することもできます:

class Derived : public Base{
public:
    using Base::operator=;
};

http://en.cppreference.com/w/cpp/language/using_declaration

私は誰かがこれで私を助けた前に、この記事を数回読んだ。

このコードがあります:

#include <iostream>

class Base {
public:
    Base(){
        std::cout << "Constructor base" << std::endl;
    }
    ~Base(){
        std::cout << "Destructor base" << std::endl;
    }
    Base& operator=(const Base& a){
        std::cout << "Assignment base" << std::endl;
    }
};

class Derived : public Base{
public:

};

int main ( int argc, char **argv ) {
    Derived p;
    Derived p2;
    p2 = p;
    return 0;
}

g ++ 4.6によるコンパイル後の出力:

Constructor base
Constructor base
Assignment base
Destructor base
Destructor base

なぜ代入演算子は継承されていないと言われているのですか?


あなたはデフォルトを持っていません

Derived& operator=(const Base& a);

あなたのDerivedクラスで。

ただし、デフォルトの代入演算子が作成されます。

Derived& operator=(const Derived& a);

これはBaseから代入演算子を呼び出します。 したがって、代入演算子を継承するのではなく、派生クラスのデフォルトの生成演算子を使用して呼び出します。


スタンダード(12.8):

代入演算子は、ちょうど1つのパラメータを持つ非静的メンバー関数によって実装されなければならない。 コピー代入演算子operator =はユーザーによって宣言されていなければ(12.8)、暗黙的に宣言されているため、基本クラス代入演算子は常に派生クラスのコピー代入演算子によって隠されます。

派生した呼び出しの代入演算子

非ユニオンクラスXに対する暗黙的に定義されたコピー/移動代入演算子は、そのサブオブジェクトのメンバー単位のコピー/移動割り当てを実行します。 Xの直接基底クラスが、最初に基底指定子リスト内の宣言の順序で割り当てられ、次に、Xの直接の非静的データメンバーが、それらがクラス定義で宣言された順序で割り当てられます。


代入演算子は実際に継承されません。 その演算子を継承することで、 BaseDerived Base b; p = a;に割り当てることができますBase b; p = a; Base b; p = a; (正当な)コンパイルに失敗します。

何が起こるかは、 Derivedカスタム定義を定義していないので、コンパイラはoperator=生成します。 自動生成operator=は、すべてのすべての基本クラスとすべてのメンバーの代入演算子を呼び出します。 この側面では、コンストラクタ/デストラクタとほぼ同じです。コンストラクタ/デストラクタは、すべてのBases /メンバのそれぞれの関数を呼び出します。





inheritance