UPD。有一个标记表明它是重复的这个问题 https://stackoverflow.com/questions/11494422/default-pure-virtual-destructor。但在这个问题中,OP询问如何使用default
定义纯虚拟析构函数。这个问题是关于有什么区别.
在 C++ 中(如果可能的话,最新标准)real使用空主体实现定义纯虚拟析构函数与仅空主体(或默认)之间的区别?
变体 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;
Update我发现变体 1 和变体 2.1/2.2 之间至少有 1 个差异:
std::is_abstract::value
is false
对于变体 1,以及true
对于变体 2.1 和 2.2。
Demo http://ideone.com/HL7OKe
也许有人能发现 2.1 和 2.2 之间的区别?
正如您所指出的,I1 和 I2* 之间的区别在于添加= 0
使类变得抽象。事实上,使析构函数成为纯虚函数是trick当你没有任何其他函数是纯虚函数时,使类成为抽象类。我说这是一个技巧,因为如果您想析构它的任何派生类(在这里您会这样做),则析构函数不能保持未定义状态,那么您仍然需要定义析构函数,无论是空的还是默认的。
现在,空的或默认的析构函数/构造函数(I21 和 I22)之间的区别更加模糊,没有太多写出来。推荐的一种是使用default
,既作为一个新的习惯用法让你的意图更清晰,而且显然也给编译器一个优化的机会。引用msdn https://msdn.microsoft.com/en-us/library/dn457344.aspx#Anchor_1
由于简单的特殊成员函数具有性能优势,因此当您需要默认行为时,我们建议您优先选择自动生成的特殊成员函数而不是空函数体。
除了可能的性能改进之外,两者之间没有明显的差异。= default
是从 C++11 开始的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)