分享
三行代码  ›  专栏  ›  技术社区  ›  Lucas Dahl

子类是否需要默认构造函数?

  •  0
  • Lucas Dahl  · 技术社区  · 6 天前

    我现在正在学习关于继承的知识,有一件事我还没有找到确切的答案。如果我有三个类,一个是超类,两个是子类,如果子类继承相同的字段,它们是否需要默认构造函数?类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);
        
    };
    

    1 回复  |  直到 6 天前
        1
  •  2
  •   JaMiT    6 天前

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

    这取决于如何使用子类。如果且仅当需要构造类的实例而不提供构造参数时,则该类需要一个默认构造函数。是否需要显式定义(或通过 using

    然而,当继承进入画面时,有一个新的警告。因为我不知道你用不用 member initialization lists ,我推荐阅读 No Matching Function Call to Base class . 如果不使用成员初始化列表,则派生类将在不使用构造参数的情况下构造其基。但是,请注意,通常最好使用初始化列表来解决这种情况,而不是添加默认构造函数。

    不,同学们 B B类 不需要默认构造函数。

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

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

        2
  •  1
  •   Nathan Pierson    6 天前

    如果希望调用代码以使用默认构造函数并创建类的实例而不向其传递其他参数,则类应该具有默认构造函数。仅仅因为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 宣言带来 二者都 A B(int,int); A(int, int); ,您可以申报 沿着 使用