【发布时间】:2010-10-12 11:17:33
【问题描述】:
写错了吗:
class A {
public:
virtual ~A() = 0;
};
对于抽象基类?
至少在 MSVC 中编译...它会在运行时崩溃吗?
【问题讨论】:
-
它可以编译,但它是否链接?
标签: c++ polymorphism destructor pure-virtual
写错了吗:
class A {
public:
virtual ~A() = 0;
};
对于抽象基类?
至少在 MSVC 中编译...它会在运行时崩溃吗?
【问题讨论】:
标签: c++ polymorphism destructor pure-virtual
是的。你还需要实现析构函数:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
应该足够了。
既然这得到了反对票,我应该澄清一下:如果你从 A 派生任何东西然后尝试删除或销毁它,A 的析构函数最终将被调用。由于它是纯粹的并且没有实现,因此会出现未定义的行为。在一个流行的平台上,这将调用 purecall 处理程序并崩溃。
编辑:将声明修复为更符合,使用http://www.comeaucomputing.com/tryitout/编译
【讨论】:
私有析构函数:当您创建派生类的对象时,它们会给您一个错误——否则不会。不过可能会出现诊断信息。
12.4 析构函数
6 析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。
具有纯虚析构函数的类是抽象类。 请注意:
10.4 抽象类
2 纯虚函数仅在使用或如同使用 (12.4) 限定 ID 语法 (5.1) 调用时才需要定义。
[注意:函数声明不能同时提供纯说明符和定义——结束 注意]
直接取自草稿:
struct C {
virtual void f() = 0 { }; // ill-formed
};
【讨论】: