2011-04-08 4 views

ответ

5

как обычные классы: да, если у вас есть конкретная потребность в реализации.

2

Если это объект, который вы планируете копировать, да, это хорошая идея. См. Мой комментарий ниже, если это не так.

Если ваш виртуальный базовый класс полагается на ресурсы, которые должны быть явно выделены и скопированы (буферы, объекты операционной системы и т. Д.), Определение конструктора копирования избавит вас от необходимости делать это в каждом производном классе отдельно (и, кроме того, это то, чего вы не могли бы сделать, если бы эти базовые ресурсы были частными, используя публичное наследование).

т.д .:

class Base { 
public: 
    Base(const Base &); 
    virtual ~Base(); 
    virtual void Method() = 0; 
    // etc... 
private: 
    int *memberIntArray; 
    int length; 
    // etc... 
}; 

class DerivedOne : public Base{ 
public: 
    DerivedOne(const DerivedOne &); 
    virtual ~DerivedOne(); 
    virtual void Method(); 
    // etc... 
protected: 
    // data, etc... 
}; 

class DerivedTwo : public Base{ 
public: 
    DerivedTwo(const DerivedTwo &); 
    virtual ~DerivedTwo(); 
    virtual void Method(); 
    // etc... 
protected: 
    // data, etc... 
}; 

/////////////////// 

Base::Base(const Base & other) { 
    this->length = other.length; 
    this->memberIntArray = new int[length]; 
    memcpy(this->memberIntArray,other.memberIntArray,length); 
} 

//etc... 

DerivedOne::DerivedOne(const DerivedOne & other) 
    : Base(other) 
{ 
    //etc... 
} 

DerivedTwo::DerivedTwo(const DerivedTwo & other) 
    : Base(other) 
{ 
    //etc... 
} 
+0

Я бы просто добавил, что конструктор копирования следует использовать в пользу переопределения оператора =. Он улучшает читаемость и менее подвержен ошибкам. – janhink

+5

Я честно предпочитаю объявлять частные конструкторы пустой копии и операторы присваивания ко всему. Таким образом, если я когда-либо попытаюсь что-то скопировать, компилятор жалуется. Только если я действительно * нуждаюсь в * скопированном объекте, я могу разоблачить это. Вы можете смеяться над этим, но вы удивитесь, сколько проблем было исправлено, когда я начал эту практику. ;) – Nate

0

Да, вы должны.
Правила использования собственных реализаций для конструктора копирования, оператора присваивания копий и деструктора для класса будут применяться даже к абстрактному классу.
Кроме того, посмотрите на Rule of Three

0

Это зависит от вашего использования, если вы что-нибудь, что требует копирования, чтобы обращаться деликатно, например, не делать копирование дескриптора. Лучше было бы определить конструктор копирования в производных классах, если это необходимо.

4

Если у него есть только чистые виртуальные методы (и нет элементов данных), то нет, синтезированный один в порядке (и ничего не сделает).

Если у него есть, у вас есть члены данных, тогда вы должны определить свой собственный конструктор копирования, если/когда имеет смысл это сделать, как и для любого другого класса. Производные классы на самом деле не имеют к этому никакого отношения.

Смежные вопросы