Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个继承类可以有多少构造函数?_C++_Class_C++11_Inheritance_Constructor - Fatal编程技术网

C++ 一个继承类可以有多少构造函数?

C++ 一个继承类可以有多少构造函数?,c++,class,c++11,inheritance,constructor,C++,Class,C++11,Inheritance,Constructor,当我试图为一个继承的类创建多个构造函数时,我抛出了一个错误:没有对A::A()的匹配函数调用。 我的代码如下所示: class A{ public: int a; int b; A(int i, int k) : a(i), b(k){ }; }; class B : public A{ public: B(){ }; B(int i, int k) : A(i, k){ };

当我试图为一个继承的类创建多个构造函数时,我抛出了一个错误:没有对A::A()的匹配函数调用。 我的代码如下所示:

class A{  
public:  
    int a;  
    int b;  
    A(int i, int k) : a(i), b(k){  

    };  

};  

class B : public A{  
public:  
    B(){  

    };  
    B(int i, int k) : A(i, k){  
    };  


};  
相当于

B() : A() {}
由于
A
没有默认构造函数,这是一个编译时错误

您可以通过以下方式进行修复:

  • 将默认构造函数添加到
    a
    ,或
  • 通过将
    B
    的默认构造函数的实现更改为使用
    A
    的现有构造函数

    B() : A(0, 0) {}
    
  • 一个继承类可以有多少构造函数

    无论类是否继承另一个构造函数,该语言都不会对构造函数的数量施加限制(除非继承的类没有未删除的构造函数,那么子类也不能有任何未删除的构造函数)

    在实践中,实施可能受到限制。标准推荐的单个类的最大支持成员声明(包括构造函数)的最小数量为4096。作为一项建议,意味着无论支持的最大值是否较低,都不会影响实现是否符合标准

    没有对A::A()的匹配函数调用

    这是因为您试图默认初始化基类子对象,但基类不是默认可初始化的

    有两种可能的解决方案:

  • 声明默认构造函数,使默认构造函数可初始化,或
  • 使用非默认构造函数初始化基类子对象。例如:


  • B(){}
    这必须调用基类的一些构造函数。由于您没有在成员init列表中指定要调用的构造函数,因此它将尝试使用
    A()
    ,但它并不存在。您的问题不是构造函数的数量(原则上,您可以拥有任意数量的构造函数),而是您没有提供您尝试使用的构造函数。
    B() : A(0, 0) {}
    
    B(): A(42, 1337) {}