【问题标题】:Does a subclass need a default constructor?子类是否需要默认构造函数?
【发布时间】:2021-05-25 08:29:59
【问题描述】:

我现在正在学习继承,但有一件事我还没有找到可靠的答案。如果我有三个类,一个是超类,两个是子类,如果我的子类继承相同的字段,它们是否需要默认构造函数? b 类没有默认构造函数,因为它从 A 继承其字段,而 c 类具有不同的字段,因此它需要自己的默认构造函数。

class A {
  
    private:
        int a;
        int b;
    
    public:
        A();
        A(int, int);
    
};

class B: public A {
  
    public:
        B(int, int);
    
};

class C : public A {
  
    private:
        int c;
    
    public:
        C();
        C(int, int);
    
};

非常感谢。

【问题讨论】:

  • 您是否需要任何特定的构造函数,这取决于您希望客户端如何构造这些对象,以及可能存在哪些基类构造函数。它与继承哪些字段没有任何关系。

标签: c++ inheritance subclass subclassing


【解决方案1】:

如果 [irrelevant],如果 [irrelevant],我的子类是否需要默认构造函数?

这取决于您的子类的使用方式。如果 - 且仅当 - 您需要在不提供构造参数的情况下构造类的实例,则该类需要默认构造函数。您是否需要显式定义(或通过using 转发)默认构造函数取决于是否定义了其他构造函数,以及该构造函数是否有重要的事情要做。这个话题应该早在继承之前就已经涵盖了。

然而,当继承进入图片时,有一个新的警告。由于我无法判断您是否使用member initialization lists,因此我建议您阅读No Matching Function Call to Base class。如果您不使用成员初始化列表,您的派生类将在没有构造参数的情况下构造它们的基类。但是,请注意,通常最好使用初始化列表而不是添加默认构造函数来解决这种情况。

类 b 没有默认构造函数,因为它从 A 继承其字段,

不,B 类没有默认构造函数,因为它定义了一个非默认构造函数。非默认构造函数阻止编译器提供默认构造函数。如果您的代码编译成功,可以得出结论B 不需要默认构造函数。

因为类 c 有不同的字段,因此它需要自己的默认构造函数。

一个类是否有字段与“需要”无关。 (字段可能更可能明确的默认构造函数是合适的,因为可能有数据要初始化,但它们的存在并不意味着需要。)

【讨论】:

    【解决方案2】:

    如果您打算调用代码以便能够使用默认构造函数并创建类的实例而不向其传递其他参数,则类应该具有默认构造函数。 B 不会因为 B 没有添加额外的成员变量而自动获取 A 的默认构造函数。

    B 不会自动拥有默认构造函数,因为A 有一个,而B 没有任何新变量。如果你想转发A 的默认构造函数,你可以使用using declaration 这样做:

    class A {
      
        private:
            int a;
            int b;
        
        public:
            A();
            A(int, int);
        
    };
    
    class B: public A {
      
        public:
            using A::A; // All of A's constructors are now publically usable as B constructors
        
    };
    

    请注意,我删除了 B(int, int); 声明,因为 using 声明将 both 构造函数从 A 前移。如果你想让B(int, int); 做一些不同于A(int, int); 的事情,你可以在using 声明旁边声明B(int, int);,更多派生的构造函数将隐藏继承的构造函数。

    【讨论】:

    • 非常感谢!
    • 第一句话不是真的——拥有不可默认构造的类是很正常的
    • @M.M 第一条语句的真实性取决于“它”是指“类”还是“默认构造函数”。前者为假,后者为真。
    • 是的,“它”应该是“默认构造函数”的意思。为清晰起见进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 2014-04-23
    • 1970-01-01
    • 2020-04-18
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多