重新分配指针如何影响多态性

How reassigning pointers affects polymorphism

这是我想知道的事情。有2个指针对应2个class个实例。代码打印出 6 行(根据注释)。前 4 条对我来说有意义,但我不明白最后 2 条。我希望第 5 行和第 6 行等于第 3 行和第 4 行,因为 pbpd 现在都指向同一个对象。请帮助我理解。

#include <iostream>

using namespace std;

class B {
public:
  virtual void run1(){cout << "Base" << endl;}
  void run2(){cout << "Base" << endl;}
};

class D: public B {
public:
  virtual void run1(){cout << "Derived" << endl;}
  void run2(){cout << "Derived" << endl;}
};

int main(int argc, char* argv[])
{
  B b, *pb;
  D d, *pd;

  pb = &b;
  pb->run1(); //Base
  pb->run2(); //Base

  pd = &d;
  pd->run1(); //Derived
  pd->run2(); //Derived

  pb = &d;
  pb->run1(); //Derived (why ?)
  pb->run2(); //Base    (why ?)
}

函数run1是虚函数,而函数run2不是虚函数。

虚函数根据使用指针的动态类型调用,非虚函数根据使用指针的静态类型调用。

指针pb的静态类型是B *

  B b, *pb;

这次作业后

pb = &b;

指针的动态类型也是B *。所以调用classB中定义的虚函数

这次作业后

pb = &d;

指针的动态类型 pbB * 更改为 D *

所以在这个声明中

pb->run1(); //Derived (why ?)

根据指针的动态类型调用虚函数。而在这个声明中

pb->run2(); //Base    (why ?)

根据指针的静态类型调用了一个非虚函数

即在所用指针指向的对象中查找[​​=49=]虚函数指针的指针

此功能定义了多态行为。