如果一个类继承自纯基类,那么什么是默认析构函数?

khic 发布于 2018-11-09 c++ 最后更新 2018-11-09 10:40 3 浏览

考虑下两个类:

struct Base
{
  virtual ~Base()
  {
  }
virtual void foo() = 0;
};
struct Derived : public Base
{
  virtual void foo()
  {
  }
};
以下是导致未定义的行为:
Base *obj = new Derived;
delete obj;
? 额外的问题:为什么一个方法被声明为虚拟的,它在派生类中是虚拟的(即使在派生类中没有使用virtual关键字),但是它对于析构函数是不正确的?
已邀请:

paut

赞同来自:

对于任何类,构造函数和析构函数都不是继承的。这在标准中规定。因此,您的代码不会导致未定义的行为,因为它将调用该类的默认构造函数/析构函数。
正是由于这个原因,继承性不适用于析构函数/构造函数。从父对象继承构造函数/析构函数是没有意义的,因为此对象可能具有所有形式的不同成员。

nrerum

赞同来自:

这不是未定义的行为。您已将基类析构函数声明为virtual,因此在运行时,delete obj将首先调用Derived中的“默认”析构函数(因为您尚未明确声明一个),然后是Base中的析构函数。

gautem

赞同来自:

Is the following causing an undefined behaviour :
不,这不是正确调用未定义的行为,因为Base的析构函数是virtual
编辑:它只是为了澄清一个疑问(在下面的评论中提出),并强调我上面所说的。 @Oli Charlesworth评论道:
Technically, even if it were not declared virtual, the behaviour would not be undefined, it would just be undesirable.
不会。行为将是未定义的。 标准的第5.3.5 / 3节说,
In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
我认为这有助于消除疑虑。:-)

zhic

赞同来自:

由于您已将基类的析构函数声明为虚拟,因此此处没有未定义的行为。 声明:

Base *obj = new Derived;
delete obj;
将导致调用派生类的析构函数,然后调用Base类的析构函数。我没有得到第二个问题

要回复问题请先登录注册