0

C ++では、ブルースエッケルで、自動的に継承されない関数は次のとおりです。

  1. コンストラクター
  2. デストラクタ
  3. Operator = (コンストラクターのようなことを行うため)

しかし、このコードは別のことを言っています

#include<iostream>             
using namespace std;`                   

class A {
 public:
   A & operator= (A &a) {
    cout<<" base class assignment operator called ";
    return *this;
   }
};

class B: public A { };

int main()
{
  B a, b;
  a.A::operator=(b); //calling base class assignment operator function
                // using derived class
  a = b; // this also works
  //getchar();
  return 0;

}   

出力 : 基本クラス代入演算子が呼び出されました

説明してください。

4

3 に答える 3

0

operator =実際、それが継承されていないと言うのは正しくありません。問題は、派生クラスに対して暗黙的に生成されたクラスによって隠さoperator =れているため、(たとえば) 以下のコードのような代入は不正になることです。

A a;
B b;
b = a;

クラスにはを受け入れるBものはなく、次の署名を持つ暗黙的に生成されたコピー代入演算子のみがあるため:operator =A

B& operator = (B const&)

状況は、基本クラスで同じ名前のメンバー関数を隠している派生クラスの通常のメンバー関数の場合と変わりません。

また、通常のメンバー関数についてusingは、基本クラスを使用可能にする宣言をクラスに含めることがoperator =できます。

class B: public A
{
public:
    using A::operator =;
//  ^^^^^^^^^^^^^^^^^^^^
};

これにより、前の例の割り当てがコンパイルされます。

于 2013-06-06T09:04:25.303 に答える
0

の operator=() の継承はありませんA。代わりに、基本代入演算子は派生クラスの代入演算子から呼び出されます。これは、暗黙の代入演算子がすべてのメンバーと基本クラスを "単純に" 割り当てるためです。

(デフォルトのコピーまたは移動割り当てがいつ、どの形式で暗黙的に生成されるかについては、標準 [ドラフト N3242] §12.8 を参照してください。)

標準 (ドラフト N3242) は次のように述べています。

§12.8 / 29

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

そこで、代入演算子を配置します。

Xです。B_ direct base class_ Aしたがって、 の暗黙の代入演算子ではB、タイプのサブオブジェクトはAを使用して代入されA::operator=(...)ます。

注: const 参照によって (または copy&swap を使用している場合は値によって) 代入演算子パラメーターを提供すると有利です。

于 2013-06-06T09:26:38.520 に答える
0

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter14_010.htmlによると=、クラスのコンストラクタ、デストラクタ、または演算子を定義しない場合、 3 つすべての単純なバージョンが自動的に作成されます。

「継承の代わりに、これらの関数は、自分で作成しない場合、コンパイラによって合成されます。(コンストラクタでは、コンパイラがデフォルト コンストラクタとコピー コンストラクタを合成するためにコンストラクタを作成することはできません。)合成されたコンストラクターはメンバーごとの初期化を使用し、合成された operator= はメンバーごとの代入を使用します。」

=したがって、B には、コンパイラによって自動的に生成された合成演算子があります。

于 2013-06-06T09:05:29.497 に答える