编译器如何处理基类破坏者在派生的破坏者中调用

How does the compiler handle base class destructor calls in the derived destructor?

本文关键字:破坏者 派生 调用 基类 何处理 处理 编译器      更新时间:2023-10-16

出于好奇,我尝试做类似下面的示例以查看编译器是否给我发出警告左右,而不是调用最终以堆栈溢出的无尽环路。我认为也许有不同的行为,而不是调用正常功能或方法。但事实并非如此。是否有针对此的特殊说明,或者只是作为正常函数调用而处理的,因为我使用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始终是不良设计的标志吗?

呼叫派生类虚拟驱动器引起基础类击振子的呼叫。但反之亦然。