虚函数如何影响 static_cast?

How does a virtual function affect static_cast?

如果我有以下代码:

#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()

但是,如果我将 Base class 中的 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()

在 Base class 中将函数设为虚函数如何影响 static_cast?

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

未定义。

"The call will be in Derived::Call()" 是一种可能的行为。 "It calls Base::Call()" 是另一种可能的行为。当未定义时,任一行为或任何其他行为都是可能的。行为可以由于添加虚函数或任何其他原因而改变或保持不变,或者只要行为未定义就没有任何原因。