C++; 我是C++新手,现在我对多态性概念和函数指针感到困惑。我脑子里有点乱 在下面截取的代码中,我声明了一个指向基类中方法的函数指针。然后我给它分配了&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!" } #包括 使用名称空间std; 类基类{ 公众: 虚拟空打印(){ cout

C++; 我是C++新手,现在我对多态性概念和函数指针感到困惑。我脑子里有点乱 在下面截取的代码中,我声明了一个指向基类中方法的函数指针。然后我给它分配了&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!" } #包括 使用名称空间std; 类基类{ 公众: 虚拟空打印(){ cout,c++,C++,行(b->*myPtr)(;调用b的BaseClass::Print成员BaseClass::Print是一个虚拟函数,由于您是通过指针类型调用它,因此将以多态方式查找它。也就是说,根据b的动态类型找到正确的函数(即DerivedClass)将被找到 第二行b->BaseClass::Print();显式调用Print成员函数,该函数是BaseClass的成员。这正是此语法的目的。它说:“嘿,我不管b的动态类型是什么-我希望您调用BaseClass版本。”即使您创建了类型为DerivedClas

(b->*myPtr)(;
调用
b
BaseClass::Print
成员
BaseClass::Print
是一个虚拟函数,由于您是通过指针类型调用它,因此将以多态方式查找它。也就是说,根据
b
的动态类型找到正确的函数(即
DerivedClass
)将被找到


第二行
b->BaseClass::Print();
显式调用
Print
成员函数,该函数是
BaseClass
的成员。这正是此语法的目的。它说:“嘿,我不管
b
的动态类型是什么-我希望您调用
BaseClass
版本。”

即使您创建了类型为
DerivedClass
的对象,它仍然有关于它从中继承的类的信息,在这种情况下-
基类
。因此,当您使用:

b->BaseClass::Print();


如果你想知道更多关于成员函数指针的细节,你只需要从它的父类调用
Print()
方法-
BaseClass

这是一本很好的读物:旁白:也许不直观,如果Print不是虚拟的,两者都会打印“嘿!”。这确实澄清了问题。谢谢!