Этот код:
class C:public B
{
C() { cout << "Constructor for C\n"; }
};
пытается вызвать конструктор B
по умолчанию.
Возможно, вы захотите:
class C:public B
{
C() : B(0) { cout << "Constructor for C\n"; }
};
но это зависит от вашей логики.
Следующее также неверно:
D(int ii) { B(ii); cout << "Constructor for D\n"; }
должно быть
D(int ii) : B(ii) { cout << "Constructor for D\n"; }
Вызов конструктора базового класса в теле конструктора дочернего класса просто создает временный объект, который ничего не делает. Чтобы получить ожидаемое поведение, вы должны вызвать конструктор в списке инициализатора .