纯抽象基的虚拟析构函数 类

Virtual destructor for pure abstract base classes

我已经看到 here and here 一个好的经验法则是为每个 class 用作基础 class 使用虚拟析构函数。我有一个纯抽象基础class(只包含纯虚函数,没有数据成员;打算用作接口)。

class A {
    public:
        virtual void foo() = 0;
};

是否可以在不创建实现文件的情况下向此 class 添加虚拟析构函数(此 class 在几个 .cpp 文件中包含的头文件中定义)仅用于空析构函数同时还要避免 clang 和 g++ 警告,例如 -Wweak-vtables?我不能将空定义放在带有纯抽象的头文件中 class 因为我会得到析构函数的多个定义。

然而,clang 生成警告:

class A {
public:
    virtual ~A() {}
    virtual void foo() = 0;
};

使用 = default 不会触发它。

class A {
public:
    virtual ~A() = default;
    virtual void foo() = 0;
};

即使两者都有效。

Demo