Аки: Есть ли «Вызов виртуалов Во время деинициализации» идиомЕсть ли динамическое связывание во время деинициализации идиомы
Я очистки некоторого старый кода и нужно исправить случаи, когда виртуальные методы вызываются в конструкторах и деструкторах. Я не знаю базу кода, и она огромная. Основной переписать не вариант.
Исправление для конструкторов было простым. Я переместил виртуальные вызовы на статический шаблон Create
и сделал все защищенные конструкторы. Тогда все, что мне нужно было сделать, - это скомпилировать и изменить все ошибки, вызывающие ошибки, для использования шаблона Create
. Минимальный шанс для регрессий. Однако для деструкторов аналога этому нет.
Как бы вы это разрешили?
Пример кода
#include <iostream>
class Base
{
public:
virtual ~Base()
{
DeInit();
}
protected:
virtual void DeInit()
{
std::cout << "Base" << std::endl;
}
};
class Derived : public Base
{
protected:
virtual void DeInit() override
{
std::cout << "Derived" << std::endl;
Base::DeInit();
}
};
int main()
{
Derived d;
}
Этот код не вызывает Derived::DeInit
(только отпечатки "Base"). Мне нужно решить такие проблемы.
Какую проблему вы должны решить? Виртуальные деструкторы уже работают по назначению. –
@KerrekSB: OP хочет избежать виртуальных вызовов в конструкторе/деструкторе, поскольку поведение вызова виртуального метода там не такое же, как в другом контексте. – Jarod42