Имеет ли смысл определять конструктор/оператор = в классе, имеющем чистый виртуальный метод или только в производных классах?Аннотация класс, конструктор копирования
ответ
как обычные классы: да, если у вас есть конкретная потребность в реализации.
Если это объект, который вы планируете копировать, да, это хорошая идея. См. Мой комментарий ниже, если это не так.
Если ваш виртуальный базовый класс полагается на ресурсы, которые должны быть явно выделены и скопированы (буферы, объекты операционной системы и т. Д.), Определение конструктора копирования избавит вас от необходимости делать это в каждом производном классе отдельно (и, кроме того, это то, чего вы не могли бы сделать, если бы эти базовые ресурсы были частными, используя публичное наследование).
т.д .:
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...
}
Да, вы должны.
Правила использования собственных реализаций для конструктора копирования, оператора присваивания копий и деструктора для класса будут применяться даже к абстрактному классу.
Кроме того, посмотрите на Rule of Three
Это зависит от вашего использования, если вы что-нибудь, что требует копирования, чтобы обращаться деликатно, например, не делать копирование дескриптора. Лучше было бы определить конструктор копирования в производных классах, если это необходимо.
Если у него есть только чистые виртуальные методы (и нет элементов данных), то нет, синтезированный один в порядке (и ничего не сделает).
Если у него есть, у вас есть члены данных, тогда вы должны определить свой собственный конструктор копирования, если/когда имеет смысл это сделать, как и для любого другого класса. Производные классы на самом деле не имеют к этому никакого отношения.
- 1. Аннотация Класс vs Класс
- 2. конструктор и конструктор копирования
- 3. конструктор копирования с указателями на собственный класс
- 4. Конструктор копирования
- 5. C# аннотация класс contructor
- 6. C++ Конструктор копирования Синтаксис
- 7. конструктор преобразования или конструктор копирования
- 8. конструктор копирования не наследуется
- 9. Java: Аннотация класс
- 10. Ошибка C2558 - конструктор копирования
- 11. Python конструктор копирования
- 12. Скрытого копирования конструктор C++
- 13. Segfault Конструктор копирования
- 14. Конкретный конструктор копирования C++?
- 15. C++, конструктор копирования путаницы
- 16. конструктор копирования унаследованного класса
- 17. Используйте конструктор копирования Stack
- 18. Условно отключить конструктор копирования
- 19. Аннотация базовый класс в Dart
- 20. Конструктор конструктора строк и конструктор копирования
- 21. Связанный список и конструктор копирования
- 22. Конструктор копирования/Оператор присваивания
- 23. SFINAE прочь конструктор копирования
- 24. Конструктор копирования для шаблонов
- 25. Конструктор копирования в C++
- 26. конструктор копирования не вызывается
- 27. конструктор копирования по адресу
- 28. конструктор копирования с оператором =
- 29. конструктор копирования называется неправильно
- 30. конструктор копирования не вызывается
Я бы просто добавил, что конструктор копирования следует использовать в пользу переопределения оператора =. Он улучшает читаемость и менее подвержен ошибкам. – janhink
Я честно предпочитаю объявлять частные конструкторы пустой копии и операторы присваивания ко всему. Таким образом, если я когда-либо попытаюсь что-то скопировать, компилятор жалуется. Только если я действительно * нуждаюсь в * скопированном объекте, я могу разоблачить это. Вы можете смеяться над этим, но вы удивитесь, сколько проблем было исправлено, когда я начал эту практику. ;) – Nate