C ++ 11接口纯虚拟析构函数

弗拉顿

UPD有一个标记,它是这个问题的重复但是在那个问题中,OP要求HOWdefault用来定义纯虚拟析构函数。这个问题是关于什么不同的

在C ++(如果可能,则为最新标准)中,使用空主体实现定义纯虚拟析构函数和仅使用空主体(或默认主体)之间真正区别是什么

变体1:

class I1 {
public:
    virtual ~I1() {}
};

版本2.1:

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

I21::~I21() {}

版本2.2:

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

I22::~I22() = default;

更新我发现变体1和变体2.1 / 2.2之间至少存在1个差异:

std::is_abstract::value适用false于变体1,以及true变体2.1和2.2。

Demo

也许有人可以发现2.1和2.2之间的区别?

亚铁

正如您所指出的,I1和I2 *之间的区别在于添加= 0使类成为抽象。实际上,当没有其他函数是纯虚拟的时,使析构函数为纯虚拟的是使类抽象技巧我说这是一个技巧,因为如果您要销毁析构函数的任何派生类(在这里您将要进行销毁),则不能不取消定义析构函数,那么您仍然需要定义析构函数,可以为空或默认。

现在,空的或默认的析构函数/构造函数(I21和I22)之间的区别变得更加晦涩难懂,那里写的内容很少。推荐使用default,这既是一种新用法,既可以使您的意图更清晰,又可以使编译器有机会进行优化。引用msdn

由于琐碎的特殊成员函数的性能优势,我们建议您在需要默认行为的情况下,优先于空函数体自动生成特殊成员函数。

除了这种可能的性能改进之外,两者之间没有明显的区别。= default是从C ++ 11开始的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章