删除拷贝构造函数的抽象基类导致派生类构造报错原因咨询
C++编译报错原因解析
核心规则
在C++11及之后的标准里,只要你显式声明了任何构造函数(包括被删除的拷贝构造函数),编译器就不会自动为类生成默认构造函数。
你的场景拆解
- 你在
Shape类里写了Shape(const Shape&) = delete;,这属于显式声明了构造函数,因此编译器不会自动生成Shape的默认构造函数Shape()。 - 派生类
Circle的构造函数(不管是你显式写的,还是编译器自动生成的),在初始化阶段都会默认调用基类Shape的默认构造函数。 - 此时
Shape没有可用的默认构造函数,编译器就会抛出「无法调用Shape::Shape()」的错误。
为什么删除拷贝构造的删除语句就解决了
当你删掉Shape(const Shape&) = delete;后,Shape类没有任何用户声明的构造函数,编译器会自动为它生成默认构造函数,Circle构造时就能正常调用这个默认构造,编译通过。
内容的提问来源于stack exchange,提问作者Chris Lee
相关产品推荐
相关产品推荐

