История изменений
Исправление
DELIRIUM,
(текущая версия)
:
Плох тем, что так делать нельзя.
Код a_human будет исполняться первым. Если ты в списке инициализации не укажешь явно конструктор базового класса, то неявно вызовется конструктор по умолчанию. Более того, если у тебя объявлен конструктор базового класса с аргументом, но не определён конструктор по умолчанию, и ты не дёргаешь конструктор базового класса явно в списке инициализации, то код у тебя не скомпилируется.
#include <iostream>
class A {
public:
A(int) { std::cout << "A" << std::endl; }
};
class B: public A {
public:
B()
: A(0)
{ std::cout << "B" << std::endl; }
};
int main() {
B b;
}
В таком виде это выдаёт:
A
B
Если убрать строчку A(0), то будет так:
test.cpp: In constructor ‘B::B()’:
test.cpp:10:6: error: no matching function for call to ‘A::A()’
test.cpp:10:6: note: candidates are:
test.cpp:5:2: note: A::A(int)
test.cpp:5:2: note: candidate expects 1 argument, 0 provided
test.cpp:3:7: note: A::A(const A&)
test.cpp:3:7: note: candidate expects 1 argument, 0 provided
Вообще, ЕМНИП, порядок вызова конструкторов такой: первыми выполняются тела конструкторов виртуальных базовых классов, затем объектов-членов в порядке их объявления в теле класса, затем остальных базовых классов, в последнюю очередь выполняется то, что ты пишешь в {} конструктора. Может я и путаю что-то с утра.
Исходная версия
DELIRIUM,
:
Плох тем, что так делать нельзя.
Код a_human будет исполняться первым. Если ты в списке инициализации не укажешь явно конструктор базового класса, то неявно вызовется конструктор по умолчанию. Более того, если у тебя объявлен конструктор базового класса с аргументом, но не определён конструктор по умолчанию, и ты не дёргаешь конструктор базового класса явно в списке инициализации, то код у тебя не скомпилируется.
#include <iostream>
class A {
public:
A(int) { std::cout << "A" << std::endl; }
};
class B: public A {
public:
B()
: A(0)
{ std::cout << "B" << std::endl; }
};
int main() {
B b;
}
В таком виде это выдаёт:
A
B
Если убрать строчку A(0), то будет так:
test.cpp: In constructor ‘B::B()’:
test.cpp:10:6: error: no matching function for call to ‘A::A()’
test.cpp:10:6: note: candidates are:
test.cpp:5:2: note: A::A(int)
test.cpp:5:2: note: candidate expects 1 argument, 0 provided
test.cpp:3:7: note: A::A(const A&)
test.cpp:3:7: note: candidate expects 1 argument, 0 provided