2017-12-08 15 views
1

派生クラスを指す親クラスポインタから新しい派生クラスポインタ(新しいメモリ位置を持つ)を取得しようとしています。別のクラスに基づいて新しい派生型を作成する

#include <iostream> 
#include <random> 
class parent{ 
public: 
    virtual void print(){ 
     printf("p\n"); 
    } 
}; 

class dev1: public parent{ 
public: 
    void print(){ 
     printf("d1\n"); 
    } 
}; 

class dev2:public parent{ 
public: 
    void print(){ 
     printf("d2\n"); 
    } 
}; 

int main(int argc, const char * argv[]) { 
    srand(time(NULL)); 

    parent*bob; 

    if(rand()%2){ 
     bob = new dev1(); 
    }else{ 
     bob = new dev2(); 
    } 
    bob->print(); 

    parent * bobwannabe; 

    bobwannabe = new typeof(*bob); 

    bobwannabe->print(); 

    return 0; 
} 

私はbobwannabeがプリントをボブどのような印刷し期待していました。 bobwannabeはbobと同じオブジェクトを指すべきではありませんが、bobと同じクラスでなければなりません。

今、bobwannabeは新しい親になります。現在のタイプの新しいボブに変換する方法はありますか、特定の用語がありますか? ありがとうございました!

+1

これはできません。 'new'ステートメントの型は静的です。意味、それはコンパイル時に知られていなければなりません。クローン機能は、以下の回答に概説されているように、あなたの問題に対する一般的な解決策です。 –

+1

検索しましたか?例えば[ポインタから多型ベースクラスへの派生クラスインスタンスのコピー/作成方法](https://stackoverflow.com/questions/5731217/how-to-copy-create-derived-class-instance-from-a- polymorphic-base-c)/ [派生C++クラスはどのようにしてベースポインタを介してクローンを作成できますか?](https://stackoverflow.com/questions/3136646/how-can-a-derived-c -class-clone-itself-via-a-base-pointer)/ [C++は基本クラスを呼び出して派生クラスをエレガントに複製する](https://stackoverflow.com/questions/36189838/c-elegantly-clone-derived-class- –

答えて

1

目的はオブジェクトを複製することです。あなたは、仮想cloneメソッドを追加することによって、それを自分で行う必要があると親クラスにコンストラクタをコピーします。

virtual parent * clone() const { return new parent(*this); } 

そしてdev1のためのようすべて派生クラスでオーバーライドします:

virtual parent * clone() const override { return new dev1(*this); } 

をしてして使用します。

parent *bobwannabe = bob->clone(); 

'typeid' versus 'typeof' in C++も参照して、オブジェクトを削除するか、またはスマートポインタを使用することを忘れないでください。

+2

ヒント: 'new auto(* this)'を使うと、タイプを手動で入力するのを避けることができます。しかし、生の所有ポインタの代わりに 'std :: unique_ptr'を使うべきです。いずれの場合でも、[CRTP](https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)は、このクラスのすべてのクラスでこのクローン機能を注入するのに最適なツールです。 – Quentin

関連する問題