C ++:继承的必备默认超类构造函数?

时间:2012-03-23 10:07:02

标签: c++ inheritance superclass default-constructor

是否必须在超类中使用默认构造函数才能继承它?假设每个派生类构造函数都显式调用一个超类构造函数,提供正确的参数 - 这样的代码会起作用吗?

5 个答案:

答案 0 :(得分:7)

  

是否必须在超类中使用默认构造函数才能继承它?

没有

如果您没有在基类中使用默认构造函数,则需要从派生类构造函数的成员中使用参数显式调用基类构造函数 - 初始化列表。

实施例,

class base
{
   public:
     base(std::string const & s, int n);
};

class derived : public base
{
   anotherClass obj;
   public:
     derived() : base("string", 10), obj(100) 
     {       //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ member-initialization list
     }
};

请注意base("string", 10)的语法。它调用基类的构造函数,将"string"作为第一个参数传递,将10作为第二个参数传递。

另请注意obj(100)初始化类型为anotherClass的成员变量:obj(10)调用anotherClass的构造函数,该构造函数将int作为参数。< / p>

答案 1 :(得分:3)

提供

  • 默认构造函数未调用explicitely
  • 所有子类在构造带参数
  • 的用户定义的超类构造函数时调用

不必编写默认构造函数。

答案 2 :(得分:2)

如果子类的每个构造函数都使用父类的显式构造函数,则父类不需要具有默认构造函数。

如果你的类没有默认构造函数,那么每个人都被迫在实例化时使用显式构造函数,对吗?它是相同的概念,如果所有的孩子都确保永远不会调用默认构造函数,那么就没有必要实现它。

答案 3 :(得分:2)

不,有一个可能的例外。通常,基类构造函数 将由派生类立即调用它,使用 由派生类提供的参数(如果有的话)。如果所有的 立即派生类显式初始化基类,然后是否 需要默认构造函数。

一个可能的例外是如果你从基地继承 类。在这种情况下,它不是直接派生类 初始化基类,但是派生类最多。依赖 关于如何组织类层次结构,您可能不需要最多 派生类了解基数;它应该足够了 大多数派生类只知道它直接继承的类 从。 (当然,这是理想的,并非总是如此。) 幸运的是,事实上,几乎每次发生这种情况时,基数都是一个 没有数据的抽象类(因此使用默认构造函数)。但 这是要记住的事情。

答案 4 :(得分:0)

不,您不需要默认构造函数。以下编译和运行,有或没有私有Default构造函数。

class A {
public:

  A(int i) {
    m = i;
  }

private:

  A() { } // This line can be commented out. Included only to make point

  int m;
};

class B : A {
public:

  B(int i) 
    : A(i) 
    {
    }

};

int main() {
  B b(10);
}