编译器如何处理基类破坏者在派生的破坏者中调用
How does the compiler handle base class destructor calls in the derived destructor?
出于好奇,我尝试做类似下面的示例以查看编译器是否给我发出警告左右,而不是调用最终以堆栈溢出的无尽环路。我认为也许有不同的行为,而不是调用正常功能或方法。但事实并非如此。是否有针对此的特殊说明,或者只是作为正常函数调用而处理的,因为我使用this
操作员明确调用基类驱动器?
示例:
class A {
virtual ~A();
};
class B : A {
virtual ~B() { this->~A(); }
};
@m.m的评论命中它。您正在两次打电话给Destructor。这是不确定的行为,可能发生任何事情,包括您观察到的行为。
(实际上,最有可能其中一个destructor调用修改了对象的VPTR,这意味着随后的驱动器调用不再转到最派生的对象。但这只是一个猜测。)
)正确的做法是不要手动致电灾难。
派生类中的虚拟破坏者始终以递归顺序首先调用parent-class class destuructors,以便将最"祖先"的基础阶层destructor称为,然后将其称为第二个。 - 最大的"祖先"等。想象一下孩子从父母那里继承,后者是从祖父母那里继承的。儿童班的攻击者实际上将称呼祖父母的破坏者,然后是父母的销毁者,然后是孩子的destuructor。
的确,您的派生类构造函数也以相同的递归顺序称其为父级构造函数。您必须想象诸如"层蛋糕"之类的派生类:继承的每个实例都会向对象添加一层。因此,儿童班有3层{祖父母,父母,孩子},每层的构造/破坏都由相应的类处理。
您正在尝试将父母驱动器调用两次,这是一个坏主意。通常,除非您超载new
操作员,否则您不必明确调用击曲线。有关更多详细信息,请参见此答案:手动打电话给Destructor始终是不良设计的标志吗?
呼叫派生类虚拟驱动器引起基础类击振子的呼叫。但反之亦然。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 需要从 istream 和 ostream 派生 iostream
- 在 C++ 中用派生类型重写成员函数
- 具有多个类、派生类的C++正向声明
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在销毁派生成员之前,在破坏者中调用共同功能
- 编译器如何处理基类破坏者在派生的破坏者中调用
- 我该如何称呼仅派生类的破坏者