超类是不是需要默认构造函数? [复制]

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 &lt;&lt; "Foobar" &lt;&lt; endl; 它会编译并且你会发现它实际上被调用了。 你隐式调用了默认构造函数Base(),所以你需要定义它。如果你不调用它,你就不需要它 如果您没有在类初始化中显式调用特定的构造函数,那么即使您在代码中看不到默认构造函数,它也会调用它。设置一个断点来说服自己我说的是真的。所以说“它永远不会被调用”是不正确的。您可以为现有构造函数提供默认参数,然后它将或多或少充当默认构造函数。 【参考方案1】:

不,这不是一个正确的假设。

你只是有一个错误。您的派生类构造函数必须调用您提供的唯一一个 Base 构造函数,它是一个参数构造函数。

    Child(int a)
    : Base(a)
    
        cout << "Child" << endl;
    

【讨论】:

以上是关于超类是不是需要默认构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

什么时候需要显式调用超类构造函数?

如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]

从复制构造函数调用默认赋值运算符是不好的形式吗?

是否需要编写默认构造函数?

Java 是不是创建默认构造函数? [复制]

Typescript React:我是不是必须为超类构造函数指定参数。那会是啥论据?