[英]How reassigning pointers affects polymorphism
这是我想知道的事情。 有 2 个指针对应 2 个 class 实例。 该代码打印出 6 行(根据注释)。 前 4 条对我来说是有意义的,但我不明白最后 2 条。我原以为第 5 行和第 6 行等于第 3 行和第 4 行,因为pb
和pd
现在都指向同一个 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.