2

これに関連する質問がたくさんありますが、正確な答えを見つけることができませんでした。クラス A がメイン クラス、B がサブクラス

  1. A::operator=(const A & other) が定義されている場合、 B::operator= のデフォルトの実装は B のメンバーをコピーしてから A::operator= を呼び出しますか?

  2. A コピー コンストラクターが定義されている場合、B のコピー コンストラクターの既定の実装は、B のメンバーをコピー構築し、A コピー コンストラクターを呼び出しますか?

  3. この動作を得るには、上記の関数 virtual を A で定義する必要がありますか? (仮想コンストラクターはナンセンスなので、operator= の場合は yes、コピー コンストラクターの場合は no だと思いますか?)

  4. デフォルトの実装の使用を強制するために、A のサブクラスの代入演算子またはコピー コンストラクターのオーバーロードを禁止できますか?

この背後にあるアイデアは、ユーザーにプラグイン API を提供することです。スクリプトは遅すぎるため、API は C++ にする必要がありますが (いずれ JIT コンパイルを試してみます)、非常に単純なはずです。

4

1 に答える 1

4
  1. クラスのデフォルトのコピー代入演算子がB削除されていない場合、[class.copy]/28

    非共用体クラスの暗黙的に定義されたコピー/移動代入演算子は、Xそのサブオブジェクトのメンバーごとのコピー/移動代入を実行します。base-specifier-listXでの宣言の順序で(つまり、 の後にリストされている順序で) の直接基底クラスが最初に割り当てられ、次に の直接の非静的データ メンバーが割り当てられます。クラス定義で宣言された順序。class X : /*here*/ {/*...*/};X

  2. 同様に、[class.copy]/15

    非共用体クラス X の暗黙的に定義されたコピー/移動コンストラクターは、その基底とメンバーのメンバーごとのコピー/移動を実行します。

    順序は、1) と同様に、最初に基本クラス (基本クラスのサブオブジェクト)、次に直接の非静的データ メンバーです。

  3. 1) および 2) で説明されている動作については、いいえ。仮想代入演算子はほとんど役に立ちません。コンストラクターはまったく仮想ではない可能性があります (意味がありません)。

    派生クラスBの仮想関数が基本クラスの仮想関数をオーバーライドするにAは、同じパラメーターの型が必要です。つまりvirtual A& operator=(A const&);、基本クラスAに を含めることができますが、クラスのオーバーライドは のBように見える必要がありました。これは、パラメーターの型のため、のコピー代入演算子virtual B& operator=(A const&);ではありません。B

  4. 「ハック」がないわけではありません。実際にオーバーロードしているわけではありませんが、すべての基本クラスの代入演算子を隠しています。そうでなければ、これは合法です:

    class A {};
    class B { int i; };
    
    A a;
    B b = a; // using A::operator=(A const&)
    
于 2013-09-12T10:17:10.877 に答える