超类是不是需要默认构造函数? [复制]
Posted
技术标签:
【中文标题】超类是不是需要默认构造函数? [复制]【英文标题】:Does a super class need a default constructor? [duplicate]超类是否需要默认构造函数? [复制] 【发布时间】:2019-05-13 13:58:01 【问题描述】:考虑以下几点:
# include <iostream>
using namespace std;
class Base
public:
Base(int a)
cout << "Base" << endl;
;
class Child: public Base
public:
Child(int a)
cout << "Child" << endl;
;
int main()
Child c = Child(0);
编译时出现错误no matching function for call to ‘Base::Base()’
。显式声明 Base
的默认构造函数可解决此问题。
在我看来,如果我想从一个类继承,那么它需要有一个默认构造函数吗?即使(在这个例子中)它永远不会被调用?这是正确的,如果是,为什么?不然上面的代码有什么问题?
【问题讨论】:
Child(int a)
-> Child(int a) : Base (a)
? 必须在某处有重复,但我懒得去寻找它:(
可能重复? ***.com/q/120876/10077
如果你添加一个不带参数的构造函数Base() cout << "Foobar" << endl;
它会编译并且你会发现它实际上被调用了。
你隐式调用了默认构造函数Base()
,所以你需要定义它。如果你不调用它,你就不需要它
如果您没有在类初始化中显式调用特定的构造函数,那么即使您在代码中看不到默认构造函数,它也会调用它。设置一个断点来说服自己我说的是真的。所以说“它永远不会被调用”是不正确的。您可以为现有构造函数提供默认参数,然后它将或多或少充当默认构造函数。
【参考方案1】:
不,这不是一个正确的假设。
你只是有一个错误。您的派生类构造函数必须调用您提供的唯一一个 Base 构造函数,它是一个参数构造函数。
Child(int a)
: Base(a)
cout << "Child" << endl;
【讨论】:
以上是关于超类是不是需要默认构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章