Подтвердить что ты не робот

Почему чистая реализация виртуального деструктора пуста? И должен ли он быть встроенным?

Я читаю в других потоках, что при реализации чистого виртуального деструктора (да, он может иметь реализацию) он должен быть пустым и должен (?) быть встроенным. Должна ли она быть пустой? Если да, то почему? Должна ли она быть встроенной? Если да, то почему?

Изменить: Вот как может быть реализован чистый виртуальный дескриптор:

class A{
    virtual ~A() = 0;
}

inline A::~A(){
    //implementation
}
4b9b3361

Ответ 1

Чистый виртуальный деструктор должен иметь реализацию (предполагая, что у вас есть хотя бы один конкретный производный класс).

Нет правила, согласно которому у чистого виртуального деструктора должно быть пустое тело. Я также не знаю какой-либо причины, по которой он должен, кроме тех же причин, у большинства деструкторов должно быть пустое тело.

Чистый виртуальный деструктор может быть встроенным или нестрочным. Я ожидал бы, что преимущества каждого зависят от количества базовых классов и нестатических членов с нетривиальными деструкторами.

Еще один улов: на некоторых популярных компиляторах, если деструктор является единственным виртуальным методом, определенным для класса, неплохо сделать его не-встроенным, чтобы помочь реализации справиться с магией полиморфизма.

Ответ 2

Звучит странно.

Во-первых, "да, это может быть реализация" - довольно странное замечание. Фактически требуется иметь реализацию (по крайней мере, на С++ 98). Нет. Любой, кто когда-либо использовал чистый виртуальный деструктор, знает это.

Во-вторых, он не должен быть всегда пустым. Он просто должен делать то, что ему нужно. Если вам явно нечего делать, оставьте его пустым. В противном случае он не будет пустым.

Наконец, он может быть встроенным или нестрочным - это не имеет никакого значения. Верно то, что он не может быть определен в определении класса. Определение должно быть внеклассовым (встроенным или нет - не имеет значения).

Ответ 3

Вам нужна реализация чистого виртуального деструктора, потому что, то, как работает виртуальный деструктор, заключается в том, что сначала вызывается деструктор самого производного класса, затем вызывается деструктор каждого базового класса. Это означает, что компиляторы генерируют вызов чисто виртуального деструктора базового класса, хотя класс является абстрактным, поэтому вы должны предоставить тело функции. Если вы не предоставляете тело, компоновщик будет жаловаться на отсутствующий символ.

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

Ответ 4

Имея в виду, что "должен" и "должен" означать разные вещи...

Чистый виртуальный деструктор может быть непустым. Не знаю, кто мог бы сказать иначе.

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

Должен ли он быть встроенным? Это не должно и не должно. Я не могу придумать ничего из того, что вы явно получаете благодаря тому, что он является "встроенным", поскольку реализации могут свободно игнорировать встроенные строки и встроенные нестрочные линии. Вообще-то, хотя нет причин создавать файл реализации не более, чем пустой деструктор в абстрактном классе.