У меня есть вопрос по поводу определения виртуального деструктора в заголовочном файле.
Например, есть заголовочный файл, который содержит:
class Object
{
public:
virtual ~Object(){}
// ...
};
Я лишь недавно столкнулся с кодом, подобным этому. Прежде, я считал, что любую реализацию нужно писать в .cpp файле, чтобы при подключении заголовка в разных единицах трансляции не возникло множественных определений.
Мои вопросы:
Стандарте и в каком месте об этом можно почитать?Заранее благодарю за помощь.
Действительно ли виртуальный деструктор можно определять в заголовочном файле?
Да, это можно сделать in-place, как в Вашем примере, можно вынести определение за пределы объявления класса, и, наконец, можно пометить деструктор как default:
inline Object::~Object() {}virtual ~Object() = default;Можно ли что-то еще определять в заголовочном файле (речь про методы и функции)?
Да, можно.
Если что-то и можно определять в заголовочном файле, то должно ли это нечто быть пустым, как в примере с ничего не делающим виртуальным деструктором?
Нет, не должно.
В каком Стандарте и в каком месте об этом можно почитать?
Можно. Любой метод, функцию или переменную можно определять в заголовочном файле, при условии что они являются inline.
Любой метод можно определять в заголовочном файле. Делать это можно либо прямо в определении класса (как в вашем примере), либо после определения класса с указанием ключевого слова inline.
Нет, не должно.
В любом стандарте С++ почитать про спецификатор inline, его связь с Правилом Одного Определения (ODR), inline-функции и способы определения методов класса как inline.
Тема inline-переменных появляется в С++17.
Единственной тонкостью тут является то, что если вы захотите объявить некий метод класса как pure virtual, но при этом еще и предоставить для него определение, то это определение должно находиться за пределами определения класса.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей