C++ 如果派生类没有';不包含静态数据?

C++ 如果派生类没有';不包含静态数据?,c++,polymorphism,destructor,virtual-destructor,C++,Polymorphism,Destructor,Virtual Destructor,假设我有: class Base { public: virtual ~Base() = 0; } class Derived: public Base { public: ~Derived(); } 在我的代码中,我需要通过Base指针删除派生的类,如下所示: delete[] pt_base; 然而,在实现的析构函数中,我实际上没有任何东西要销毁。但是我仍然需要通过基类删除它们 在没有大量浪费代码和空析构函数的情况下,实现我想要的东西的最佳方法是什么?如果您想为析构函数

假设我有:

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

class Derived: public Base {
public:
    ~Derived();
}
在我的代码中,我需要通过
Base
指针删除
派生的
类,如下所示:

delete[] pt_base;
然而,在实现的析构函数中,我实际上没有任何东西要销毁。但是我仍然需要通过基类删除它们


在没有大量浪费代码和空析构函数的情况下,实现我想要的东西的最佳方法是什么?

如果您想为析构函数提供一个“默认”实现,那么提供
default
关键字正是为了这个目的。它导致用户声明的析构函数与隐式定义的析构函数具有相同的行为

class Derived : public Base {
public:
    ~Derived() = default;
}
这相当于提供一个空的析构函数体,如
{}
,但可能更好地显示您的意图

但是,不需要提供这些析构函数:

[C++11:12.4/4]:
如果类没有用户声明的析构函数,则析构函数被隐式声明为默认值(8.4)。隐式声明的析构函数是其类的
内联公共
成员

[C++11:12.4/5]:
X
的默认析构函数定义为已删除,如果:

  • X
    是一个类似于并集的类,它有一个带有非平凡析构函数的变量成员
  • 任何非静态数据成员都具有类类型
    M
    (或其数组),并且M具有已删除的析构函数或默认析构函数无法访问的析构函数
  • 任何直接或虚拟基类都有一个已删除的析构函数或一个无法从默认析构函数访问的析构函数
  • 或者,对于虚拟析构函数,查找非数组释放函数会导致歧义,或者导致从默认析构函数中删除或无法访问的函数
[……]

这些规则在这里都不适用,并且在基类具有纯或不纯虚拟析构函数的情况下,也不存在更改此行为的规则,因此不会删除上面示例中隐式声明的析构函数(即有效)

以下措辞是可以为您声明派生析构函数的另一条有力线索:

[C++11:12.4/9]:
析构函数可以声明为
virtual
(10.3)或纯
virtual
(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)是
virtual


不幸的是,如果您希望析构函数是纯的,您将无法对基类使用
default
;您仍然需要单独提供其[empty]定义:

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

Base::~Base() {}

不需要,
Base
类的虚拟析构函数声明/定义就足够了,但要使其抽象化,需要在
派生的
类中指定此析构函数

如果你只是申报

class Base {
public:
    virtual ~Base() {} // <<< Have a definition
};
类基{
公众:

virtual~Base(){}/“virtual constructor”?Np.BTW你喜欢我的标准引文吗?@LightnessRacesinOrbit这是所有引文中的引文。尽管你对当前的标准肯定是正确的(我很高兴能跟上这一点),我在我的答案中发布的内容过去几十年来一直对我有用?现在无效吗?嗯?C++11有什么问题吗?如果你愿意,我可以发布C++03和C++14中相同的措辞。这个“解决方案”完全改变了程序,使
Base
不再是一个接口。不知道为什么它的投票率如此之高。