Поведение конструкторов при наследовании
Объясните мне, пожалуйста, поведение конструкторов при наследовании. Я прекрасно понимаю, что сли у нас есть класс B, который наследуется от А, то при объявлении объекта класса B вызывается сначала конструктор А, затем конструктор В. Но вот вопрос. Если у нас есть конструктор в классе А, а в классе B его нет, то каким образом происходит вызов конструктора при объявлении объекта класса B? Два раза вызывается конструктор А?
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class A {
protected:
int X;
int Y;
A() {
X = rand() % 100;
Y = rand() % 200 + 100;
}
public:
virtual void Date() = 0;
};
class B : public A {
public:
virtual void Date() {
cout << "X = " << X << "\n";
cout << "Y = " << Y << "\n";
}
};
class C : public B {
public:
virtual void Date() {
cout << "X = " << X << "\t" << "Y = " << Y << "\n";
}
};
void date(B *object) {
object->Date();
}
int main() {
srand(time(NULL));
B b;
C c;
date(&b);
date(&c);
}
В этой программе я реализую полиморфизм посредством переопределения метода Date, который вывод инфу о полях либо в строчку, либо один под другим.
Ответы (1 шт):
У ваших классов B и C есть конструкторы, неявно сгенерированные компилятором. Они ведут себя (почти) как B() {}, или как B() : A() {}, который делает то же самое (аналогично для C).
То есть все как обычно - вызываются конструкторы A и B, и, соответственно, A и C. Но конструкторы B и C ничего не делают.
при объявлении объекта класса B вызывается сначала конструктор А, затем конструктор В
Если придираться, это не совсем верно. Сначала вызывается конструктор B. Первым делом он инициализирует члены класса и его родителей, то есть вызывает конструктор A, а уже потом выполняет свое тело.
То есть, хотя тело конструктора A выполняется до B, сам конструктор A вызывается не до конструктора B, а из него, до захода в его тело.