Код, который вы опубликовали, неверен.
Во-первых, чтобы вызвать такой конструктор B
, A
должен быть получен из B
.
Во-вторых, вы предоставляете 2 реализации для A::A
.
Я объясню на следующем примере:
class B
{
int _x;
public:
B();
B(int x);
}
B::B()
{
_x = 42;
}
B::B(int x)
{
_x = x;
}
class A : public B
{
public:
A(int x);
};
A::A(int x) : B(x) {}
Теперь, поскольку A
is-a B
(это и есть наследование), всякий раз, когда вы создаете A
, базовый объект - B
- также будет создан. Если вы не укажете его в списке инициализатора, будет вызван конструктор по умолчанию для B
- B::B()
. Даже если вы не заявляете, оно существует.
Если вы укажете другую версию конструктора - как в этом случае, B::B(int)
, эта версия будет вызвана.
Это просто способ, которым разработан язык.
EDIT:
Я немного отредактировал код.
Предположим следующее определение конструктора A
:
A::A(int x) : B(x) {}
//...
A a(10);
//a._x will be 10
Если, однако, ваш конструктор определен как:
A::A(int x) {}
Будет вызван конструктор по умолчанию
B
:
A a(10);
//a._x will be 42
Надеюсь, это понятно.