C++, определение виртуального деструктора в заголовочном файле

161
17 ноября 2021, 14:00

У меня есть вопрос по поводу определения виртуального деструктора в заголовочном файле.

Например, есть заголовочный файл, который содержит:

class Object
{
    public:
    virtual ~Object(){}
    // ...
};

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

Мои вопросы:

  1. Действительно ли виртуальный деструктор можно определять в заголовочном файле?
  2. Можно ли что-то еще определять в заголовочном файле (речь про методы и функции)?
  3. Если что-то и можно определять в заголовочном файле, то должно ли это нечто быть пустым, как в примере с ничего не делающим виртуальным деструктором?
  4. В каком Стандарте и в каком месте об этом можно почитать?

Заранее благодарю за помощь.

Answer 1

Действительно ли виртуальный деструктор можно определять в заголовочном файле?

Да, это можно сделать in-place, как в Вашем примере, можно вынести определение за пределы объявления класса, и, наконец, можно пометить деструктор как default:

  1. inline Object::~Object() {}
  2. virtual ~Object() = default;

Можно ли что-то еще определять в заголовочном файле (речь про методы и функции)?

Да, можно.

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

Нет, не должно.

В каком Стандарте и в каком месте об этом можно почитать?

  1. https://en.cppreference.com/w/cpp/language/function#Function_definition
  2. http://eel.is/c++draft////dcl.fct.def
Answer 2
  1. Можно. Любой метод, функцию или переменную можно определять в заголовочном файле, при условии что они являются inline.

  2. Любой метод можно определять в заголовочном файле. Делать это можно либо прямо в определении класса (как в вашем примере), либо после определения класса с указанием ключевого слова inline.

  3. Нет, не должно.

  4. В любом стандарте С++ почитать про спецификатор inline, его связь с Правилом Одного Определения (ODR), inline-функции и способы определения методов класса как inline.

    Тема inline-переменных появляется в С++17.

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

READ ALSO
C++, препроцессор, условная компиляция и ODR

C++, препроцессор, условная компиляция и ODR

Я провожу небольшое исследование существующих способов нарушить ODR (Правило Единого Определения) при использовании inline, и меня интересует...

158
Решить задачу с помощью рекуррентного соотношения, алгоритмы (С++)

Решить задачу с помощью рекуррентного соотношения, алгоритмы (С++)

Назовём число счастливым, если оно делится на k и сумма его цифр лежит в интервале [p, q]Нужно подсчитать, сколько счастливых чисел лежат в интервале...

129
Как быстро проверить делимость числа?

Как быстро проверить делимость числа?

Есть 2 числа, нужно найти за короткое время на КАКИЕ числа они оба делятся без остатка? Как это можно сделать? Если пытаться обычным циклом,...

161
Проблема с таймингом

Проблема с таймингом

Вечер добрыйЕсть программа для эмуляции

99