为什么为派生类定义副本构造函数要求定义基类的默认构造函数?

巨型铵

我在单个cpp文件中有以下代码:

class Base
{
  public:
    //constructor
    Base() = delete;
};

class Derived : public Base
{
  public:
    //copy constructor
    Derived( const Derived & other ){};
};

int main( int argc, char* argv[] )
{
  //empty
}

但是,编译cpp文件会导致错误

exp.cpp:在复制构造函数'Derived :: Derived(const Derived&)'中:
exp.cpp:15:37:错误:使用删除的函数'Base :: Base()'
Derived(const Derived&other){};

exp.cpp:7:5:注意:此处声明
Base()= delete;
^ ~~~

我不明白为什么。为派生类定义复制构造函数时,基类的默认构造函数如何发挥作用?

让-巴蒂斯特·尤涅斯

构造派生类的对象必须构造其基类的对象(因为派生实例是基实例+扩展)。

因此,初始化派生实例必须初始化基本实例。问题是,当我为派生类调用ctor时,将调用基类的ctor吗?当您将派生的ctor定义为:

Derived( const Derived & other ){};

编译器发现您没有指定对特定基类ctor的调用,然后编译器生成了不带参数的对ctor的调用。但是,a,您从基类中将其删除。然后发出一个错误。

您可能认为为派生类调用复制ctor会生成对未删除的基类的复制ctor的调用。但是,a,不,规则是,如果您不为基类指定特定的ctor调用,则会调用不带参数的ctor。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么派生类的构造函数只能在C ++的类中定义?

来自分类Dev

从派生类构造函数调用基类构造函数

来自分类Dev

派生类不能访问私有成员(尽管构造函数是在基类中定义的)

来自分类Dev

调用基类的构造函数而不在派生类中定义它

来自分类Dev

为什么派生类可以调用基类构造函数两次?

来自分类Dev

为什么派生类的构造函数要在C ++中初始化虚拟基类?

来自分类Dev

为什么派生类需要使用基类构造函数

来自分类Dev

(为什么)在纯虚拟派生类中是否需要虚拟基类构造函数调用?

来自分类Dev

具有基类参数的派生类的副本构造函数的排序

来自分类Javascript

为什么在基类构造函数中看不到派生类属性值?

来自分类Dev

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

来自分类Java

从Java中的派生类调用基类构造函数

来自分类Dev

从模板派生类调用模板基类的构造函数

来自分类Dev

复制派生类的构造函数,更改基类

来自分类Dev

在声明派生类时调用基类的构造函数

来自分类Dev

从派生类访问模板基类的构造函数

来自分类Dev

在类体之外定义函数时,c ++派生的构造函数-“无默认构造函数”

来自分类Dev

从虚拟基础派生类,没有默认构造函数

来自分类Dev

为C ++中的基类和派生类声明“虚拟”构造函数?

来自分类Dev

为什么删除副本构造函数会影响用户定义的默认构造函数?

来自分类Dev

在派生类中重写构造函数,由超类的接口定义

来自分类Dev

在基类构造函数中使用派生类属性

来自分类Dev

添加自定义析构函数时,Move构造函数在派生类中消失

来自分类Dev

向基类添加默认构造函数会更改sizeof()派生类型

来自分类Dev

在派生类 C++ 的构造函数中调用基类的构造函数

来自分类Dev

如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

来自分类Dev

是否可以从基类构造函数调用派生类构造函数?

来自分类Dev

让隐式派生类构造函数调用基类构造函数

来自分类Dev

派生类的构造函数可以比其基类的构造函数具有更多的参数吗?

Related 相关文章

  1. 1

    为什么派生类的构造函数只能在C ++的类中定义?

  2. 2

    从派生类构造函数调用基类构造函数

  3. 3

    派生类不能访问私有成员(尽管构造函数是在基类中定义的)

  4. 4

    调用基类的构造函数而不在派生类中定义它

  5. 5

    为什么派生类可以调用基类构造函数两次?

  6. 6

    为什么派生类的构造函数要在C ++中初始化虚拟基类?

  7. 7

    为什么派生类需要使用基类构造函数

  8. 8

    (为什么)在纯虚拟派生类中是否需要虚拟基类构造函数调用?

  9. 9

    具有基类参数的派生类的副本构造函数的排序

  10. 10

    为什么在基类构造函数中看不到派生类属性值?

  11. 11

    在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

  12. 12

    从Java中的派生类调用基类构造函数

  13. 13

    从模板派生类调用模板基类的构造函数

  14. 14

    复制派生类的构造函数,更改基类

  15. 15

    在声明派生类时调用基类的构造函数

  16. 16

    从派生类访问模板基类的构造函数

  17. 17

    在类体之外定义函数时,c ++派生的构造函数-“无默认构造函数”

  18. 18

    从虚拟基础派生类,没有默认构造函数

  19. 19

    为C ++中的基类和派生类声明“虚拟”构造函数?

  20. 20

    为什么删除副本构造函数会影响用户定义的默认构造函数?

  21. 21

    在派生类中重写构造函数,由超类的接口定义

  22. 22

    在基类构造函数中使用派生类属性

  23. 23

    添加自定义析构函数时,Move构造函数在派生类中消失

  24. 24

    向基类添加默认构造函数会更改sizeof()派生类型

  25. 25

    在派生类 C++ 的构造函数中调用基类的构造函数

  26. 26

    如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

  27. 27

    是否可以从基类构造函数调用派生类构造函数?

  28. 28

    让隐式派生类构造函数调用基类构造函数

  29. 29

    派生类的构造函数可以比其基类的构造函数具有更多的参数吗?

热门标签

归档