繁体   English   中英

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

[英]How reassigning pointers affects polymorphism

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

#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 ?)
}

function run1是虚拟 function 而 function run2不是虚拟 ZC194D1452674C70A。

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

指针pb的 static 类型为B *

  B b, *pb;

在这个任务之后

pb = &b;

指针的动态类型也是B * 所以调用了class B中定义的虚拟function。

在这个任务之后

pb = &d;

指针pb的动态类型从B *更改为D *

所以在这个声明中

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

根据指针的动态类型,称为虚拟 function。 虽然在此声明中

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

根据指针的 static 类型,称为非虚拟 function。

即在使用的指针指向的object中查找指向虚拟function指针表的指针。

此功能定义了多态行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM