重新分配指针如何影响多态性
How reassigning pointers affects polymorphism
这是我想知道的事情。有2个指针对应2个class个实例。代码打印出 6 行(根据注释)。前 4 条对我来说有意义,但我不明白最后 2 条。我希望第 5 行和第 6 行等于第 3 行和第 4 行,因为 pb
和 pd
现在都指向同一个对象。请帮助我理解。
#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;
指针的动态类型 pb
由 B *
更改为 D *
。
所以在这个声明中
pb->run1(); //Derived (why ?)
根据指针的动态类型调用虚函数。而在这个声明中
pb->run2(); //Base (why ?)
根据指针的静态类型调用了一个非虚函数
即在所用指针指向的对象中查找[=49=]虚函数指针的指针
此功能定义了多态行为。
这是我想知道的事情。有2个指针对应2个class个实例。代码打印出 6 行(根据注释)。前 4 条对我来说有意义,但我不明白最后 2 条。我希望第 5 行和第 6 行等于第 3 行和第 4 行,因为 pb
和 pd
现在都指向同一个对象。请帮助我理解。
#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;
指针的动态类型 pb
由 B *
更改为 D *
。
所以在这个声明中
pb->run1(); //Derived (why ?)
根据指针的动态类型调用虚函数。而在这个声明中
pb->run2(); //Base (why ?)
根据指针的静态类型调用了一个非虚函数
即在所用指针指向的对象中查找[=49=]虚函数指针的指针
此功能定义了多态行为。