2016-10-27 13 views
-1

私は3つのクラスを持っています。今コピーコンストラクタと継承

class A 
{ 
private: 
    int num; 
//... 
// THIS IS AN ABSTRACT CLASS (has a pure virtual function) 
} 

class B : public A 
{ 
private: 
    float fnum; 
//... 
} 

class C : public A 
{ 
private: 
    double dnum; 
    //... 
} 

、私はそのタイプ(B又はC)に従ってA*オブジェクトを初期化したい機能

foo(A& someA) 

とその中を持っています。このAは元々はBまたはC

とすることができます。どのようにコピーコンストラクタを使用してそれを行うことができますか?私はこのようなものがあります:

A* newA = A.isB ? new B(someA) : new C(someA) 

をし、私のようなコピーコンストラクタを追加しました:

B(const B& b) : A(b) { fnum = b.fnum; } 
C(const C& c) : A(c) { dnum = c.dnum; } 

をしかし、もちろん、これは行でエラーがスローさがあることを

A* newA = A.isB ? new B(someA) : new C(someA) 

適切なコンストラクタはありません。

+0

プロトタイプのデザインパターン(例:https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns/Creational_Patterns#Prototype)を見てください。 – Leon

答えて

1

簡単な解決策は、次のとおり

A* newA = A.isB ? new B(dynamic_cast<const B&>(someA)) : 
        new C(dynamic_cast<const C&>(someA)); 

クリーナー溶液を宣言することである。

virtual A* clone() const = 0; 
A

、次いでnewAを作成するだけである。

A* newA = someA.clone(); 

各派生クラス、書き込み:

A* B::clone() const { 
    return new B(*this); 
} 

しかしを注意してください:あなたはBからクラスを派生場合、あなたはcloneを再実装する必要がありますし、そうでない場合、コンパイラは警告しません。