virtual-destructor相关内容

英特尔C++编译器和Wnon-Virtual-dtor标志提供(错误?)警告

我正在尝试编译我的一些代码,这些代码在g++(使用--Wnon-虚dtor标志)中编译得很好。此外,我的IDE和clang-tidy没有警告我(我当然知道这可能是假的)。 当我尝试用Intel的icpc编译相同的代码(实际上是这个icpc (ICC) 19.1.2.254 20200623)时,我收到了一个警告,现在我可以追踪到它--我想知道是我有什么错,还是这个警告在我的情况下实际上是不正 ..
发布时间:2022-08-29 13:33:05 C/C++开发

没有虚拟析构函数可能存在内存泄漏?

#include 使用命名空间标准;类基{诠释一个;上市:基数(){a =0;}};类derv:公共基础{诠释 b;上市:derv() {b =1;}};主函数(){基础 *pb = new derv();删除铅;} 我在derv 类中没有虚拟析构函数,它只删除derv 对象的基础部分吗? 解决方案 可能会. 因为 base 没有虚拟析构函数,所以您的代码会表现 ..

有没有什么自动化的方法来实现构造函数后和析构函数前的虚方法调用?

由于从构造函数和析构函数内部调用虚方法的众所周知的问题,我通常最终得到的类需要在构造函数之后调用最终设置方法,并调用预拆卸方法就在他们的析构函数之前,就像这样: MyObject * obj = new MyObject;obj->Initialize();//虚方法调用,需要在ctor for (obj) 之后才能正常运行[...]obj->AboutToDelete();//虚方法调用,需要 ..
发布时间:2021-12-23 09:06:34 C/C++开发

虚拟析构函数是继承的吗?

如果我有一个带有虚拟析构函数的基类.是否有派生类也要声明虚析构函数? 类基{上市:虚拟 ~base () {}};派生类:基{上市:虚拟~派生(){}//1)~派生() {}//2)}; 具体问题: 1) 和 2) 一样吗?2) 是因为它的基础而自动虚拟化还是“停止"虚拟化? 派生的析构函数如果无关,可以省略吗? 声明派生析构函数的最佳做法是什么?声明它是虚拟的、非虚拟的还是尽可能省 ..
发布时间:2021-12-17 19:16:40 C/C++开发

为什么要在 C++ 中为抽象类声明虚拟析构函数?

我知道在 C++ 中为基类声明虚拟析构函数是一种很好的做法,但是即使对于用作接口的抽象类,声明 virtual 析构函数总是很重要吗?请提供一些原因和示例. 解决方案 对于界面来说,这一点更为重要.你的类的任何用户都可能持有一个指向接口的指针,而不是一个指向具体实现的指针.当他们来删除它时,如果析构函数是非虚拟的,他们将调用接口的析构函数(或编译器提供的默认值,如果您没有指定),而不是派生 ..
发布时间:2021-12-17 19:01:51 C/C++开发

何时使用虚拟析构函数?

我对大多数 OOP 理论有深刻的理解,但让我很困惑的一件事是虚拟析构函数. 我认为无论是什么,对于链中的每个对象,总是会调用析构函数. 你打算什么时候让它们虚拟化,为什么? 解决方案 当您可能通过指向基类的指针删除派生类的实例时,虚拟析构函数很有用: 类基础{//一些虚方法};派生类:公共基础{~派生(){//做一些重要的清理工作}}; 在这里,您会注意到我没有将 Base ..
发布时间:2021-12-01 14:40:56 C/C++开发

在没有虚拟析构函数的情况下删除基类指针时,会导致内存泄漏吗?

以下是解释虚拟析构函数的示例.(请参见 http://www.geeksforgeeks .org/g-fact-37/) 我根据该示例修改了代码,并对内存泄漏有疑问. 假设基类的变量为int num,派生类的变量为float money. 当调用delete base_ptr;时,由于基类的析构函数是虚拟的,因此应先调用~derived(),然后再调用~Base(). 我的问题 ..
发布时间:2020-07-13 22:21:31 C/C++开发

4级继承链中的C ++虚拟析构函数.

我正在对虚拟析构函数进行一些小实验以进行审查-想知道是否有人对以下内容有简单的解释(使用vs 2010): 我定义类层次结构A-B-C-D,D继承C,C继承B,B继承A,A是基数; 进行了2个实验: 第一个实验- A有一个虚拟的析构函数. B具有非虚拟析构函数 C有一个虚拟的析构函数 D具有非虚拟的析构函数 //------------------- ..
发布时间:2020-07-13 22:20:22 C/C++开发

是否“删除"?多态性可以正常工作吗?

BaseClass * p = new DerivedClass(); delete p; 我知道第二行将在没有虚拟析构函数的情况下调用基类的析构函数,而在没有派生类的情况下调用派生类的析构函数,但会正确地释放内存(假设BaseClass' s对象占用8个字节的空间,而DerivedClass占用1个12的空间-它会释放8个字节还是12个字节)并在两种情况下都摆脱掉对象? 解决方案 如 ..
发布时间:2020-07-13 22:20:16 C/C++开发

可以内联虚拟函数

如果我定义这样的类: class A{ public: A(){} virtual ~A(){} virtual void func(){} }; 这是否意味着虚拟析构函数和func是内联的 解决方案 编译器是否选择内联一个由内联定义的函数,这完全取决于编译器.通常,仅当编译器可以证明静态类型与动态类型匹配或编译器可以安全地确定动态类型时,才可以内联vir ..
发布时间:2020-07-13 22:20:07 C/C++开发

错误LNK2019-抽象类中的虚拟析构函数

可能重复: C ++中的纯虚拟析构器 我有两个类:抽象的"Game"类和派生的"TestGame"类. TestGame中的所有功能都是单独实现的(为了使其能够编译).我只有一个错误: TestGame.obj:错误LNK2019: 未解析的外部符号"public: 虚拟__thiscall Game ::〜Game(void)“ (?? 1Game @@ UAE @ XZ)在 函数 ..
发布时间:2020-07-13 22:19:02 C/C++开发