【发布时间】:2014-02-02 06:27:15
【问题描述】:
我知道需要纯虚拟析构函数的情况。我也知道,如果我们不为他们提供实现,它会给我一个链接器错误。我不明白的是为什么在如下所示的代码片段中会出现这种情况:
int main()
{
Base * p = new Derived;
}
这里没有删除,所以没有调用析构函数,因此不需要它的实现(假设它的行为应该像其他已声明但未定义的普通函数,链接器只有在我们调用它们时才会抱怨)......还是我错过了什么?
我需要了解为什么这应该是一个特例?
编辑:基于来自 BoBTFish
的 cmets这是我的基类和派生类
class Base
{
public:
Base(){}
virtual ~Base() = 0;
};
class Derived : public Base
{
};
【问题讨论】:
-
你没有展示你如何写
Base和Derived,但我猜发生的事情是编译器正在为Derived生成析构函数,它将尝试调用析构函数Base,不存在。 -
它确实可以编译...只有链接器会抱怨...尝试一下..我正在使用 VS2012,我非常有信心这不应该依赖于编译器...一旦我出现错误就会消失给出 ~Base 的实现
-
@Arun 它编译是因为在编译时它不知道
Base::~Base()函数将在哪里实现。至于Derived::~Derived(),由于你没有定义它,它是自动生成的(相当于~Derived() = default;)。
标签: c++ pure-virtual virtual-destructor