【问题标题】:Virtual destructor for pure abstract base classes纯抽象基类的虚拟析构函数
【发布时间】:2019-04-20 03:09:12
【问题描述】:

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

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

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

【问题讨论】:

  • " 将获得析构函数的多个定义。" - 不,你不会,如果它在课堂上是内联的 - 你试过了吗?
  • virtual ~A() = default;
  • virtual ~A() {}
  • @Neil Butterworth 这会触发来自 clang 的 -Wweak-vtables
  • 嗯,我认为重复是一个不同的问题。

标签: c++ g++ abstract-class clang++ virtual-destructor


【解决方案1】:

然而,clang 会生成警告:

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

使用= default 不会触发它。

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

即使两者都有效。

Demo

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2019-12-08
    • 2023-03-23
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多