2013-11-24 3 views
0

Я только что прочитал 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

Конструктор по умолчанию не будет создан, если существует хотя бы определенный пользователем конструктор. И в вашем случае у вас есть один.

2

Если вы объявите конструктор не по умолчанию, компилятор не будет создавать значение по умолчанию.

Я рекомендую использовать ключевое слово default для конструкторов по умолчанию, поэтому каждый сразу видит, что он делает.

0

Вы, ребенок, 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; 
} 

Итак, если вы хотите получить идентификатор конструктора по умолчанию, вам нужно явно вызывает одну из других изнутри initilization списков класса ребенка CTR.

Смежные вопросы