派生类构造函数初始化列表时,基类没有默认构造函数

时间:2013-11-24 11:18:47

标签: c++ constructor derived-class initializer-list

我刚读过Constructors and initialization of derived classes
我遇到了一个问题。代码如下。
问题是当我评论父默认构造函数时。会有错误。
但是默认构造函数不应该由编译器自动创建? 谢谢你回答我的问题。

#include <iostream>
using namespace std;
class Father{
public:
    int food;
    Father(){} //  father default constructor 
    Father(int f):food(f){
    }
};
class Child: public Father{
public:
    int beverage;
    Child(int b):beverage(b){
    }
};   
int main(int argc, const char * argv[])
{
    Child c(10);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

如果至少存在用户定义的构造函数,则不会生成默认构造函数。在你的情况下,你有一个。

答案 1 :(得分:2)

如果声明非默认构造函数,编译器将不会创建默认值。

我建议使用default关键字作为默认构造函数,这样每个人都可以立即看到它的作用。

答案 2 :(得分:0)

You Child ctr称之为父亲ctr,它必须这样做。它会调用默认值,除非你告诉它不这样做。运行以下代码,然后切换注释了哪个Child ctr,您将看到。

class Father{
public:
    int food;
    Father(){ cout<<"father::default\n";} //  father default constructor
    Father(int f):food(f){
    }
};
class Child: public Father{
public:
    int beverage;
//   Child(int b): beverage(b){}
    Child(int b): Father(45), beverage(b){    }
};


int main(int argc, const char * argv[])
{
    Child c(10);
    return 0;
}

因此,如果你想获得默认构造函数的id,你需要在子类ctrs的启动列表中显式调用其中一个。