写下这样的代码是有问题的吗:
class A {
public:
virtual ~A() = 0;
};
对于一个抽象基类,这样至少可以在MSVC编译通过...但它会在运行时崩溃吗?
写下这样的代码是有问题的吗:
class A {
public:
virtual ~A() = 0;
};
对于一个抽象基类,这样至少可以在MSVC编译通过...但它会在运行时崩溃吗?
是的,你还需要实现析构函数:
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 只有在使用限定符ID语法(5.1)调用纯虚函数时才需要定义它。
[注意:函数声明不能同时提供纯指示符和定义 - 结束说明]
直接从草案中取出:
struct C {
virtual void f() = 0 { }; // ill-formed
};