【问题标题】:How many constructors can an inherited class have?一个继承的类可以有多少个构造函数?
【发布时间】:2020-01-09 13:26:36
【问题描述】:

当我尝试为继承的类创建多个构造函数时,我有一个错误提示:没有对 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(),但它不存在。
  • 您的问题不在于构造函数的数量(原则上,您可以拥有任意数量的构造函数),而是您没有提供您尝试使用的构造函数。

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


【解决方案1】:
B() {}  

等价于

B() : A() {}

由于A 没有默认构造函数,这是编译时错误。

您可以通过以下方式修复它:

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

    B() : A(0, 0) {}
    

【讨论】:

    【解决方案2】:

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

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

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

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

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

    有两种可能的解决方案:

    1. 声明一个默认构造函数,以便 A 默认可初始化,或者
    2. 使用非默认构造函数初始化基类子对象。示例:

    B(): A(42, 1337) {}
    

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2011-07-06
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多