6

検討:

class A
{
public:
    A( int val ) : m_ValA( val ) {}
    A( const A& rhs ) {}
    int m_ValA;
};

class B : public A
{
public:
    B( int val4A, int val4B ) : A( val4A ), m_ValB( val4B ) {}
    B( const B& rhs ) : A( rhs ), m_ValB( rhs.m_ValB ) {}
    int m_ValB;
};

int main()
{
    A* b1 = new B( 1, 2 );
    A* b2 = new A( *b1 ); // ERROR...but what if it could work?
    return 0;
}

「newA( b1)」が新しいBコピーを作成してAを返すことを解決できた場合、C ++は壊れますか?

これも役に立ちますか?

4

6 に答える 6

23

この機能が必要ですか、それとも単なる思考実験ですか?

これを行う必要がある場合、一般的なイディオムは次のClone方法を使用することです。

class A
{
public:
    A( int val ) : m_ValA( val ) {}
    A( const A& rhs ) {}
    virtual A *Clone () = 0;
    int m_ValA;
};

class B : public A
{
public:
    B( int val4A, int val4B ) : A( val4A ), m_ValB( val4B ) {}
    B( const B& rhs ) : A( rhs ), m_ValB( rhs.m_ValB ) {}
    A *Clone() { return new B(*this); }
    int m_ValB;
};

int main()
{
    A* b1 = new B( 1, 2 );
    A* b2 = b1->Clone();
    return 0;
}
于 2009-06-20T13:35:14.443 に答える
4

あなたが本当に探しているのは仮想コピーコンストラクターと呼ばれ、 eduffyが投稿したものがそれを行うための標準的な方法です。

テンプレートを使用してそれを行う賢い方法もあります。(免責事項:自己宣伝)

于 2009-06-20T13:37:31.117 に答える
2

eduffyによる答えへのほんの少しの追加:代わりに

class B : public A {
  ...
  A *Clone() { return new B(*this); } 
  ...

};

次のように宣言できます。

class B : public A {
  ...
  B *Clone() { return new B(*this); } // note: returning B *
  ...

};

それはまだ仮想の有効なオーバーライドと見なされており、A::Clone();直接呼び出すとより良いですB *

于 2010-05-29T18:43:51.517 に答える
1

表現

new A(*b1)

あなたが適切な過負荷を持っていたと仮定すると、すでに意味があります。

別の意味が与えられた場合は、別の意味を取得するための別の方法を提供する必要があります。あなたが望む意味を得る方法がすでにあることを考えると、これは一種の無意味です:

new B(*b1)

そして、どちらが読みやすいかを推測します。

于 2009-06-20T13:36:48.653 に答える
0

上で指摘したように、これを実装する方法はいくつかあります。

Bの新しいインスタンスが返された場合に質問に答えるにnew A( *b1 )は、これは機能しません。

int main()
{
    A* b1 = new B( 1, 2 );
    A a( *b1 ); // What size would 'a' be if it was polymorphicly constructed?
    return 0;
}
于 2009-06-20T19:58:34.377 に答える
0

はい。いいえ。

既存のプログラムの意味を変更したり、派生クラスがコンパイルユニット内で既知である場合の基本クラス。

コンストラクタとデストラクタは、初心者がそのまま理解できるほど複雑です。それらにさらに複雑さを注入することは賢明ではありません。

于 2009-06-20T13:36:31.697 に答える