2016-03-23 15 views
1

抽象基本クラスA*へのポインタがあれば、それを(基本クラスとして)コピーまたは代入し、派生コピーコンストラクタまたは代入演算子を呼び出す必要があります。私はコピーコンストラクタが仮想ではないことを理解しているので、おそらくコピーコンストラクタはこれを行うためのオプションではありませんが、代入演算子はそうです。それでも動作していないようです:次のコードは、bの割り当てに失敗した派生した代入演算子を基本クラスから呼び出す方法は?

assigned a 
x! 
destroyed b 
destroyed b 

を出力します。

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    virtual void x()=0; 
    virtual ~A() {} 
    virtual A& operator=(const A& other) { cout << "assigned a" << endl; return *this;} 
}; 

class B : public A 
{ 
public: 
    virtual B& operator=(const B& other) { cout << "assigned b" << endl; return *this;} 
    virtual void x() { cout << "x!" << endl; } 
    virtual ~B() { cout << "destroyed b" << endl; } 
}; 

int main() 
{ 
    A* a = new B(); 
    A* aa = new B(); 
    *aa=*a; 
    aa->x(); 
    delete a; 
    delete aa; 
    return 0; 
} 

どのようにするには?

EDITこの質問は正しく以下に回答されましたが、間違った質問でした。代入演算子をオーバーライドしようとするべきではありません。なぜなら、Aのサブクラスにを割り当てようとしないからです。です。単純な答えのために(たぶん)C++ elegantly clone derived class by calling base class

+0

大したことではありませんが、疑問は**仮想基本クラス**について質問し、コードにはありません。 –

+0

私はあなたが「抽象的な」基本クラスではなく、「仮想」ではないと思います(これはまったく別物です)。基本クラスの抽象度は、あなたの問題とは無関係です。 – molbdnilo

+0

です。編集を参照してください。 –

答えて

4

問題は、あなたのB::operator=Aに1を上書きしていないということです参照してください。

virtual A& operator=(const A& other) { cout << "assigned b" << endl; return *this;} 

に変更してください。また、メンバー関数をオーバーライドするときには、overrideキーワードを使用してください(C++ 11が必要)。オーバーライドしないと、コードはコンパイルされません。あなたのケースでは、それはあなたの間違い

error: 'virtual B& B::operator=(const B&)' marked 'override', but does not override

PSをキャッチしているだろう:あなたはおそらくについてcovariant return typesを考えていました。それを機能させるには、戻り値の型を除いて関数のシグネチャを同じにする必要があります。たとえば、これは動作します:

+0

これはいいですが、 'B :: operator ='は 'const A&other'が' B'のインスタンスであることを保証できない場合、 'B'に固有のフィールドにどのようにアクセスしますか? –

+0

@SideshowBob [dynamic_cast'](http://en.cppreference.com/w/cpp/language/dynamic_cast)の結果をテストして、 'other'が本当に' B'であるかどうかを調べることができます。しかし、これはあなたのデザインが健全であるかどうかを考えさせるべきです。 – vsoftco

+0

これが難しいという事実は、私のデザインに本当に疑問を投げかけています。最終的には、クラスが本当に何であるかを知らなくても、クラスを基本クラスのポインタから深くコピーする必要があります。非常識な要件ではないカプセル化の原則の下で、右か? –

関連する問題