我是 C++ 的新手,现在对多态性概念和函数指针感到困惑。我脑子里有点困惑。
在下面截取的代码中,我声明了一个指向 BaseClass 中方法的函数指针。然后我给它分配了 &BaseClass::Print
最后两行是我感到困惑的部分:为什么这两行不会产生相同的结果?我猜这是因为指针 myPtr 指向 v 表,但我不确定。另外,如果我想让 myPtr 调用重写的 BaseClass::Print() 函数,我该怎么做?
谁能向我澄清一下?谢谢。
#include <iostream>
using namespace std;
class BaseClass{
public:
virtual void Print(){
cout << "Hey!" << endl;
}
};
class DerivedClass : public BaseClass
{
public:
void Print(){
cout << "Derived!" << endl;
}
};
int main()
{
BaseClass *b = new DerivedClass;
void (BaseClass::*myPtr)();
myPtr = &BaseClass::Print;
(b->*myPtr)(); //print "Derived!"
b->BaseClass::Print(); //print "Hey!"
}
最佳答案
行 (b->*myPtr)();
调用 b
的 BaseClass::Print
成员。 BaseClass::Print
是一个虚函数,由于您是通过指针类型调用它,因此将以多态方式进行查找。也就是说,将根据 b
的动态类型(即 DerivedClass
)找到正确的函数。
第二行 b->BaseClass::Print();
显式调用 Print
成员函数,它是 BaseClass
的成员。这正是此语法的用途。它说“嘿,我不在乎 b
的动态类型是什么 - 我希望你调用 BaseClass
版本。”
关于c++ - C++ 中的函数指针和重写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946455/