LINUX.ORG.RU

C++ паттерн правильного абстрактного класса

 , ,


0

1

Искал в интернете, но везде узкоспециальные примеры, мне же нужен правильный, типичный шаблон абстрактного класса, например фигур Shape, и класса наследника, например Box. Что бы разобратьсяхорошо, что к чему и как это писать правильно.

Базовый класс для многих случаев жизни. Остальные варианты - «узкоспециализированные».

class TypicalAbstractClass
{
public:
    TypicalAbstractClass() {}
    virtual ~TypicalAbstractClass(){}
};

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Голова пустая,
Отдает как барабан,
Каждый с ЛОРа это знает - 
Ждет ТСа скоро бан.
Pavval ★★★★★
()
Ответ на: комментарий от UVV

Да, ты прав, в базовом классе необходим виртуальный деструктор. Да, я об этом знаю. Да, я его не написал.

virtual ~Shape() = default;

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

virtual ~Shape() = default;

11-ый выглядит как совсем другой язык..

UVV ★★★★★
()

Нет такого, каждый случай уникален

yoghurt ★★★★★
()
Ответ на: комментарий от UVV

А в чём отличие «= delete» от прятания в private?

Более красивая ошибка компилятора, а также невозможность вызвать изнутри класса (фейл private, т.к. тогда ошибкой срет только линкер, причем без конкретных строк кода). А так - та же функциональность, только не костылями.

Pavval ★★★★★
()
Последнее исправление: Pavval (всего исправлений: 1)

Правильный абстрактный класс это мёртвый отсутствующий абстрактный класс.

anonymous
()

В Qt есть целая пачка классов QAbstract... .

khenty
()

ыыыыы, зачетная иконка.

Deleted
()
Ответ на: комментарий от grondek

Виртуальный деструктор — лишний. Он нужен только для узкоспециализированного случая удаления наследника по указателю на базовый.

Да и тривиальный конструктор можно убрать, он же автоматически генерируется компилятором.

NeXTSTEP ★★
()
Ответ на: комментарий от NeXTSTEP

Деструктор не лишний. Ты не знаешь, как будет наследоваться и использоваться класс другими разработчиками.

grondek
()
Ответ на: комментарий от NeXTSTEP

Виртуальный деструктор — лишний. Он нужен только для узкоспециализированного случая удаления наследника по указателю на базовый.

Узкоспециализированного? Ну-ну.

cyanide_regime
()
Ответ на: комментарий от grondek

И как отсутствие виртуального деструктора может мне или им помешать?

NeXTSTEP ★★
()
Ответ на: комментарий от NeXTSTEP

struct not_so_simple_notifier : colorful_notifier

Не нужно на самом деле плодить виртуальных матрешек (и париться потом о корректности/некорректности)

slackwarrior ★★★★★
()
Ответ на: комментарий от anonymous

С чего бы он не корректный? Семантика не меняется, вне зависимости от того, какие оптимизации применяет компилятор.

NeXTSTEP ★★
()
Ответ на: комментарий от NeXTSTEP

Ты тоже не рассказал, что юзеру твоего класса помешает таки сделать

struct not_so_fucking_intended_class : public notifier
...
notifier* n = new not_so_fucking_intended_class();
...
delete n; 

Кроме твоих (или его) добрых намерений?

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Компилятор предупредит.

main.cpp:99:9: warning: deleting object of abstract class type ‘notifier’ which has non-virtual destructor will cause undefined behaviour [-Wdelete-non-virtual-dtor]
  delete n; 
         ^

NeXTSTEP ★★
()
14 марта 2017 г.
Ответ на: комментарий от Pavval

ты не знаешь, почему его ещё не забанили?

anonymous
()
Ответ на: комментарий от UVV

Есть такая категория людей — всё называть сахаром.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.