【问题标题】:Is the deletion of a constructor inherited?构造函数的删除是继承的吗?
【发布时间】:2014-09-25 18:52:09
【问题描述】:

使用关键字delete可以防止编译器自动添加某些构造函数的标准实现。

这种删除是否继承到子类?

【问题讨论】:

  • 你为什么不写一个简单的测试
  • @texasbruce 什么样的测试以及如何测试?
  • 可能我理解错了,如果我理解正确的话,你可以创建一个类,将一个构造函数设置为delete,然后继承这个类并尝试使用构造函数创建
  • @texasbruce 很好的经验实验很有趣,但在 C++ 中,我正在寻找更明确的答案。程序员在这门语言中犯的很多错误都来自表面上的知识。但是不,你没有误会我的意思。

标签: c++ inheritance c++11 constructor


【解决方案1】:

显然,但我不会确切地说该属性是继承的。这是由于编译器生成的派生类构造函数使用了基类构造函数。例如,编译器生成的派生类的默认构造函数使用基类的默认构造函数。因此,如果基类默认构造函数不存在,无论出于何种原因(无论是被显式删除,还是其他原因),编译器都无法为派生类生成默认构造函数。但这并不能阻止您为派生类创建自己的构造函数,该派生类使用与被删除的基类构造函数不同的基类构造函数。

【讨论】:

  • But this doesn't stop you from creating your own constructor for the derived class which uses a different base class constructor than the one which was deleted. 不幸的是,是的。因此,没有简单的方法可以防止子类被复制构造。
【解决方案2】:

使用关键字delete可以防止编译器自动添加某些构造函数的标准实现。

嗯,不是真的。是的,它确实达到了这个目的。但它也阻止了自己实现该构造函数。

一般来说,构造函数不会被继承。删除基类中的构造函数不会导致派生类中相应的构造函数也被删除。它确实强制编译器将派生类中的相应构造函数隐式定义为已删除——但前提是您自己没有定义它。

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2018-09-27
    • 2015-06-21
    • 2013-12-02
    • 2011-04-21
    • 2013-06-01
    相关资源
    最近更新 更多