【问题标题】:C++ virtual destructor definitions [duplicate]C ++虚拟析构函数定义[重复]
【发布时间】:2017-01-27 08:25:22
【问题描述】:

我有三门课

class A {
    // pure virtual funcs and member vars
    virtual ~A();
}

class B : public A {
    // some more pure virtual funcs
    virtual ~B();
}

class C : public B {
     // concrete implementations
     ~C() {}
}

目前,这不会以“未定义对 `typeinfo” 的引用进行编译(~B() 未定义,很容易修复)但是我想知道是否只定义 'virtual ~B {}' 是正确的或者 ~C 是否应该是虚拟的并被定义以便对 ~B 的调用被调度到 ~C?

【问题讨论】:

  • −1不是真正的代码。除了阻止编译的遗漏之外,我们不知道您还遗漏了什么。
  • 纯虚函数应该以 a = 0 结尾; virtual ~A() = 0;
  • 您有一个链接器错误,而不是编译器错误。此外,代码中的所有析构函数都是虚拟的;覆盖函数是隐式虚函数。
  • 您对~A()~B() 的定义在哪里?
  • @SheldonJuncker 请注意,即使是纯虚拟析构函数也需要一个主体。

标签: c++ inheritance virtual-destructor


【解决方案1】:

假设这个问题是关于纯虚析构函数(代码不是真实的,所以很难说,但你说的是缺少析构函数定义,以及纯虚函数):

必须定义一个可以调用的纯虚析构函数。

你不能在类定义中定义它。

除了 Bjarne Stroustrup(语言创建者)的旧评论,他认为 = 0 表示“没有正文”之外,没有明确的理由为什么必须在类定义之外定义它。


示例。

struct S
{
    virtual ~S() = 0;
};

S::~S() {}

【讨论】:

  • 为什么我们不能在类定义(抽象类A)中将其定义为空析构函数?
  • @πάνταῥεῖ:不,我的意思是在类定义中。析构函数。
  • @dfri:如果你将它定义为一个空的析构函数,那么它就不再是纯虚拟的了。
  • 你在哪里看到 OP 提到了纯虚拟析构函数?
  • @Cheers 和 hth。 - Alf:正如 πάντα ῥεῖ 所写(没有提到纯虚析构函数;相当抽象);我们不是考虑一个带有(其他)纯虚方法的抽象类吗?在这种情况下,我们可以提供一个空的析构函数定义,同时仍然保持类抽象。
猜你喜欢
  • 2016-08-14
  • 2011-08-12
  • 2020-07-06
  • 2012-10-24
  • 2017-08-13
  • 2012-09-21
  • 2012-04-18
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多