C++:يمكن نسخ متعددة الأشكال منشئات العمل ؟

StackOverflow https://stackoverflow.com/questions/1021626

  •  06-07-2019
  •  | 
  •  

سؤال

النظر:

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;
}

سوف C++ تكون مكسورة إذا "جديد( b1 )" كان قادرا على حل خلق جديد ب نسخ وإعادة A?

هذا حتى تكون مفيدة ؟

هل كانت مفيدة؟

المحلول

هل تحتاج هذه الوظيفة، أم أن هذا مجرد تجربة فكرية؟

إذا كنت تحتاج إلى القيام بذلك، ولغة مشتركة هو أن تكون هناك طريقة 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;
}

نصائح أخرى

ما كنت حقا تبحث عن ما يسمى نسخة الظاهرية منشئ, و ما eduffy نشر هو المعيار طريقة للقيام بذلك.

هناك أيضا طرق ذكية للقيام بذلك مع قوالب.(تنويه:الترويج الذاتي)

ومجرد إضافة صغيرة إلى الإجابة من طرف 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 *

والتعبير

new A(*b1)

وقد سبق معنى، لنفترض كان لديك الزائد المناسب.

إذا أنه تم إعطاء معنى مختلف، وكنت قد لتوفير طريقة أخرى للحصول على معنى آخر. هذا هو نوع من العبث نظرا إلى أن هناك بالفعل وسيلة للحصول على المعنى الذي تريده:

new B(*b1)

وتخمين الذي هو أكثر وضوحا للقراءة.

نعم. رقم

وهناك عدد من الطرق لتنفيذ الاستنساخ (على سبيل المثال أكثر أو أقل الطريقة القياسية استنساخ ()، والاختلافات معلمات من المصانع وجوه، مع أو بدون حقن التبعية للتكوين) دون تغيير معنى البرامج القائمة، أو مما يجعل من المستحيل إنشاء مثيلات من الفئات الأساسية عندما يعرف فئة مشتقة ضمن وحدة تجميع.

ومنشئات و destructors معقدة بما فيه الكفاية لفهم للمبتدئين كما هو. أن ضخ المزيد من التعقيد الى لهم من الحكمة.

وكما أشير أعلاه هناك عدد من الطرق لتنفيذ ذلك.

لإجابة على سؤالك إذا عاد new A( *b1 ) مثيل جديد من B ثم هذا لن يجدي نفعا.

int main()
{
    A* b1 = new B( 1, 2 );
    A a( *b1 ); // What size would 'a' be if it was polymorphicly constructed?
    return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top