C++ C++;虚析构函数定义

C++ C++;虚析构函数定义,c++,inheritance,virtual-destructor,C++,Inheritance,Virtual Destructor,我有三节课 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

我有三节课

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?

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

必须定义可以调用的纯虚拟析构函数

不能在类定义中定义它

没有明确的理由说明为什么必须在类定义之外定义它,除了Bjarne Stroustrup(语言创建者)的一条旧注释,他认为
=0
表示“无主体”


例如

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

S::~S() {}

−1这不是真正的代码。我们不知道你还遗漏了什么,除了那些妨碍编译的遗漏<代码>虚拟~A()=0您有链接器错误,而不是编译器错误。而且,代码中的所有析构函数都是虚拟的;重写函数是隐式虚函数。你对
~A()
~B()
的定义在哪里?@SheldonJuncker注意,即使是纯虚析构函数也需要一个体。为什么我们不能在类定义(抽象类
A
)中将其定义为空析构函数?@πάνταῥεῖ: 不,我的意思是在类定义中。“如果你把它定义为一个空的析构函数,那么它就不再是纯虚拟的。你在哪里看到提到纯虚拟析构函数的OP?@Cheers and hth.-Alf:asπνταῥεῖ 写(没有提到纯虚拟析构函数;相当抽象);我们不考虑一个抽象类(其他)纯虚拟方法吗?在这种情况下,我们可以提供析构函数的空定义,同时保持类的抽象性。