C++ C+中的纯虚析构函数+;

C++ C+中的纯虚析构函数+;,c++,polymorphism,destructor,pure-virtual,C++,Polymorphism,Destructor,Pure Virtual,写这样的话是错误的吗 class A { public: virtual ~A() = 0; }; 对于抽象基类 至少它在MSVC中编译。。。它会在运行时崩溃吗?是。您还需要实现析构函数: class A { public: virtual ~A() = 0; }; inline A::~A() { } 应该足够了 既然这次投票被否决了,我应该澄清一下:如果你从a派生任何东西,然后试图删除或销毁它,a的析构函数最终会被调用。由于它是纯的,并且没有实现,因此会出现未定义的行为

写这样的话是错误的吗

class A {
public:
    virtual ~A() = 0;
};
对于抽象基类


至少它在MSVC中编译。。。它会在运行时崩溃吗?

是。您还需要实现析构函数:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }
应该足够了

既然这次投票被否决了,我应该澄清一下:如果你从a派生任何东西,然后试图删除或销毁它,
a的析构函数最终会被调用。由于它是纯的,并且没有实现,因此会出现未定义的行为。在一个流行的平台上,这将调用purecall处理程序并崩溃


编辑:修复声明以使其更加一致,使用

私有析构函数编译:当您创建派生类的对象时,它们会给您一个错误,否则不会。不过,可能会出现诊断

12.4析构函数

6析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数

带有纯虚析构函数的类是抽象类。 请注意:

10.4抽象类

2纯虚函数只有在使用限定id语法(5.1)调用时才需要定义

[注意:函数声明不能同时提供纯说明符和定义-end 注]

直接摘自草稿:

struct C {
   virtual void f() = 0 { }; // ill-formed
};

嗯,是的。纯仅意味着派生类还需要提供实现。实现纯虚拟函数实际上是合法的。对于提供默认实现非常有用,但强制子类显式调用它。MSN并注意,如果在头中有该定义,则需要在其前面加上“inline”以避免违反ODR(一个定义规则)。为什么必须显式定义::~a(),因为我认为每个对象都有一个默认析构函数?与任何类型的继承一样,析构函数链总是被调用,基类析构函数也不必总是被定义。更好的说法是,一旦声明析构函数,它就不会自动为您实现。+1。我认为赫伯·萨特在这方面也有一些好的信息:。有趣的是,任何纯虚拟函数都可能提供一个实现,而不仅仅是析构函数。是的,这是你在面试中为了吓唬面试官而做的事情;)根据我的经验,这其实并不少见。@Neil Butterworth:哪一个?@Dirk-“任意函数”场景。发现它被用来实现一些常见行为并不罕见。它可以编译,但它是否链接?