【发布时间】:2015-07-30 08:09:58
【问题描述】:
又名:是否有任何“取消初始化期间调用虚拟”的成语
我正在清理一些旧代码,并且需要修复在构造函数和析构函数中调用虚拟方法的情况。我不知道代码库,它很大。主要重写不是一个选项。
构造函数的修复很简单。我将虚拟调用移至静态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 希望避免在构造函数/析构函数中进行虚调用,因为调用虚方法的行为与在其他上下文中不同。
标签: c++ dynamic-binding