是否必须在超类中使用默认构造函数才能继承它?假设每个派生类构造函数都显式调用一个超类构造函数,提供正确的参数 - 这样的代码会起作用吗?
答案 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)
提供
不必编写默认构造函数。
答案 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);
}