从析构函数调用虚拟方法-解决方法
Calling virtual method from destructor - workaround?
我需要为基类Base
的所有子类声明finalizing方法finalize()
,该方法应该在销毁期间调用,我的意图是从~Base()
调用纯virtual void Base::finalize() = 0
,但c++禁止这样做。所以我的问题是
我们怎么能强迫后代以正确和初步的方式做一些收尾工作呢?
该代码无法编译:
#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
如果我使Base::finalize()
不是纯虚拟的,则从~Base()
调用它,而不将其分派给子级,因为它已经被销毁。
我可以从孩子的析构函数调用finalize(),但问题是如何强制执行。换句话说,我的问题是:是否有可能强制编写基类后代的人使用finalizing方法,好吧,以另一种方式,而不是在文档中对其进行注释?:)
析构函数是释放获取资源的正确位置,但每个类都有责任释放自己的资源。class A
获取的资源不应该(也不能)被class Base
释放。
定义虚拟析构函数允许在删除指向class A
对象的指向class Base
的指针时调用class A
的析构函数
Base* p = new A;
delete p; // Both A and Base destructors are sequencially called!
因此,要实现适当的资源释放,只需要在每个类自己的析构函数中释放每个类的资源。
这就是虚拟析构函数的作用:
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
virtual ~B() {}
};
当类型为B
的对象被销毁时,无论是指向B
的指针还是指向A
的指针,都将调用这两个析构函数。首先是B::~B()
,然后是A::~A()
。
使基类析构函数纯虚拟,并带有一个实体,它应该完全按照您的意愿执行。
为什么不使用Base的destructor?这就是析构函数的用途。
搜索RAII,发现c++中最好的东西之一。
大多数习惯使用其他语言的人都必须发现这一点。c++中的资源管理与大多数其他计算机语言完全不同。
相关文章:
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 此解决方案中生成更改的方法数量(自上而下)有什么问题?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 是否有解决方法可以在 c++ 中为 short 定义用户定义的文字?
- 不为 emplace() 定义构造函数的解决方法
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 函数模板部分专业化-有什么解决方法吗
- 带boost的过载模糊性:可选,解决方法
- 继承构造函数和其他变量的解决方法
- 解决虚拟方法的歧义继承的两种方法
- 解决歧义的方法
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 对前向声明类型进行unique_ptr的解决方法
- 必须使用尾随返回类型的示例,因为无法用旧方法解决问题
- 如何通过动态规划方法解决这个问题?
- extern可以解决这个问题吗,或者我可以通过其他方法解决这个问题吗?
- 从析构函数调用虚拟方法-解决方法