Как виртуальная функция влияет на static_cast? - PullRequest
0 голосов
/ 08 октября 2019

Если у меня есть следующий код:

#include <iostream>

class Base
{
  public:
  void Call(){std::cout << "Base";}
};

class Derived: public Base
{
  public:
  void Call(){std::cout << "Derived";}
};

int main() {
  Base *base = new Base;
  static_cast<Derived*>(base)->Call();

  return 0;
}

Вызов будет в Derived::Call()

Однако, если я сделаю функцию Call () в Базовом классе виртуальной

#include <iostream>

class Base
{
  public:
  virtual void Call(){std::cout << "Base";}
};

class Derived: public Base
{
  public:
  void Call(){std::cout << "Derived";}
};

int main() {
  Base *base = new Base;
  static_cast<Derived*>(base)->Call();

  return 0;
}

Звонит Base::Call().

Как виртуальная функция в базовом классе влияет на static_cast?

1 Ответ

3 голосов
/ 08 октября 2019

Поведение

Base *base = new Base;
static_cast<Derived*>(base)->Call();

Не определено.

"Вызов будет в Derived :: Call ()" - это одно из возможных действий. «Он вызывает Base :: Call ()» - другое возможное поведение. Либо поведение, либо любое другое поведение возможно, когда оно не определено. Поведение может измениться или остаться таким же, как следствие добавления виртуальной функции, или по любой другой причине, или безо всякой причины, пока поведение не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...