C++ 类内的纯虚拟析构函数定义给出编译错误

C++ 类内的纯虚拟析构函数定义给出编译错误,c++,inheritance,destructor,pure-virtual,C++,Inheritance,Destructor,Pure Virtual,基类中的纯虚拟析构函数应该有一个定义。否则,编译器将在链接期间从派生类析构函数生成对基类析构函数的调用,并将导致链接错误 我尝试在基类中定义纯虚拟析构函数,如下所示: class base { public: base() { cout << "constructor in base class\n"; } virtual ~base()=0 {} }; class base { publi

基类中的
纯虚拟析构函数应该有一个定义。否则,编译器将在链接期间从派生类析构函数生成对基类析构函数的调用,并将导致链接错误

我尝试在基类中定义纯虚拟析构函数,如下所示:

class base
{
   public:
      base()
      {
         cout << "constructor in base class\n";
      }

      virtual ~base()=0
      {}
};
class base
{
   public:
      base()
      {
         cout << "constructor in base class\n";
      }

      virtual ~base()=0;
};

base::~base()
{

}
类基
{
公众:
base()
{

cout写入以下内容的语法无效:

virtual ~base()=0
{}

如果要提供纯虚拟成员函数的实现,则应在类之外执行。大多数情况下不应执行此操作,因为无论如何都不应调用纯虚拟函数。但是,可以为纯虚拟函数定义实现

事实上,纯虚拟析构函数必须有一个实现,这是因为所有基类的析构函数在对象销毁时都会被调用,而不管给定类中的析构函数是否为纯虚拟析构函数


因此,如果您创建从
base
派生的任何类的实例,那么在某个时候,将调用对象所属的所有类的析构函数,包括
base::~base()
析构函数。如果不定义它,链接器将找不到所需的符号,并会抱怨。

纯虚拟方法可以有实现,但它们使基类抽象,并强制派生类覆盖这些方法

假设您在基类中有一个指针成员,您希望在析构函数中删除它,但同时也使该类抽象-因此您实现了纯虚拟析构函数

这是一个实现细节-析构函数被实现的事实从外部看不到。

我看了这一页:


根据我的理解,纯虚拟析构函数必须有一个定义(即使是空的),因为每个派生类都必须调用基类析构函数。你的第二个例子是正确的

许多其他的答案都假设使用默认实现的纯虚拟函数是非法的,但这是不正确的

对于纯虚拟析构函数,必须有一个定义(请参阅xmoex中的答案)

诚然:

§10.4/2函数声明不能同时提供纯说明符和 还有一个定义


但是,正如您所注意到的,可以在声明之外提供一个定义。

析构函数是唯一的方法,即使它是纯虚拟的,也必须有一个实现才能使它所定义的类有用。因此,与@Kiril的回答相反,我认为纯虚拟函数可以具有im补充

有些离题:

struct base {
    virtual void func() = 0;
};

void base::func() { /* default implementation */ }

class derived : public base{
    void func() { base::func(); } // have to explicitly call default implementation.
};

纯虚拟成员函数或析构函数不能有任何正文(但`=0`)。纯虚拟析构函数
有一个异常。它应该有一个定义,否则在派生类析构函数调用基类析构函数时会导致链接错误。我假设声明实现为空的纯虚拟析构函数的唯一原因是它是否需要纯虚拟析构函数来执行e类抽象。否则,您应该简单地将析构函数声明为虚拟的。这是真的吗?任何纯虚拟方法都可以有一个实现,而不仅仅是析构函数。@K-ballo我没有说别的。@FailedDev:这不是离题,您的答案是有价值的:),+1表示答案和谦逊:)为什么
xmoex
的答案给出了一个向下的v注意。他不仅提供了一个很好的链接,而且为这个问题提供了更多的线索。悲哀!K-ballo:请更具体一点?你添加的参考资料就是我要问的+1@K我相信,代码> RoAG
从C++标准中引用了1条,因为它必须被定义。这是我丢失的一部分。