Я пытаюсь выполнить задание в своей книге, но я не понимаю выход. Когда основной код в программе выполняется выход:Наследование, почему два конструктора вызываются для базового класса, C++
B :: B (3)
B :: B() // почему это выводимый
B :: B (- 3)
D :: D (3)
Он получает это от вызова B::B(int n) {}
первых, а затем B::B() {}
сопровождаемой следующих два строк, которые я получаю. Таким образом, программа называется первой, поскольку она объявлена как конструктор класса A в функции и ей нужно назначить значения, что я не получаю, это строка вывода 2, почему B::B() {}
даже называется? он получает вызов как конструктор, но не должен просто вызвать конструктор с параметрами?
class B {
public:
B(); //why is this called?
B(int n);
};
// Definitions of B
B::B() {
cout << "B::B()\n";
}
B::B(int n) {
cout << "B::B(" << n << ")\n";
}
class D : public B {
public:
D();
D(int n);
private:
B b;
};
// Definitions of D
D::D() {
cout << "D::D()\n";
}
D::D(int n) : B(n) {
b = B(-n);
cout << "D::D("<< n <<")\n";
}
int main(int argc, const char * argv[]) {
// insert code here...
D d(3);
return 0;
}
Но почему конструктор для поля b называется? isnt B :: B (3) конструктор для b-поля? – user2076774
Это конструктор базового класса. Производный класс неявно содержит объект базового класса. Ваш 'B b;' лишний, если вам нужен только один 'B'. – Pixelchemist
@ user2076774 Нет, поле 'b' является полностью нормальным полем, которое не имеет ничего общего с базовым классом (за исключением того, что он по совпадению имеет один и тот же тип). – immibis