LINUX.ORG.RU

История изменений

Исправление 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