Почему базовый метод вызывается однажды переопределенным в C ++ - PullRequest
0 голосов
/ 12 мая 2019

У меня есть ситуация, подобная приведенной ниже (код НЕ точный, просто чтобы донести свою мысль).Когда я звоню D.A(), я ожидаю, что будет напечатано слово "Desc", но вместо этого напечатано "Base".

class Base {
public:
  void A() { B(); }
  virtual void B() { cout << "Base"; }
}

class Descendant : public Base {
public:
  virtual void B() overriden { cout << "Desc"; }
}

main () {
  Descendant D;
  D.A();
}

Здесь должно быть что-то концептуальное, чего я упускаю.Должно ли D.A() вызвать "Desc" для печати?Если нет, то почему?

1 Ответ

1 голос
/ 12 мая 2019

В вопросе есть важная ошибка.Метод A фактически является конструктором базового класса.И имеет смысл, что конструктор не может вызывать какие-либо методы (даже виртуальные) производных классов, поскольку эти производные классы еще не существуют.

Когда A не является ctor, он работает как положено.

...