gpt4 book ai didi

c++ - 去初始化成语期间是否有任何动态绑定(bind)

转载 作者:行者123 更新时间:2023-11-28 02:22:56 25 4
gpt4 key购买 nike

又名:是否有任何“在取消初始化期间调用虚拟”的成语

我正在清理一些旧代码,需要修复在构造函数和析构函数中调用虚拟方法的情况。我不知道代码库,而且它很大。重大重写不是一种选择。

构造函数的修复很简单。我将虚拟调用移至静态 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”)。我需要解决这类问题。

Working example code

最佳答案

这非常棘手,因为析构函数在离开作用域时会自动调用,无论是通过正常流程、breakcontinuereturn 还是 抛出。这也是为什么不能将参数传递给析构函数的原因。

直接的解决方案是从 Derived::~Derived 调用 Derived::DeInit。这还有一个额外的好处,即仍然可以使用 Derived 成员。

另一种是创建自己的智能指针类,在T::~T之前调用T::DeInit。为防止绕过,请从您的 Create 中返回此智能指针。

关于c++ - 去初始化成语期间是否有任何动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31718398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com