4

我是 C++ 新手,现在对多态性概念和函数指针感到困惑。我脑子里有点混。

在下面的代码中,我声明了一个指向 BaseClass 中方法的函数指针。然后我将它分配给 &BaseClass::Print

最后两行是我感到困惑的部分:为什么这两行不会产生相同的结果?我想这是因为指针 myPtr 指向 v-table,但我不确定。另外,如果我想让 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!"
}
4

2 回答 2

4

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

第二行b->BaseClass::Print();显式调用Print属于BaseClass. 这正是这个语法的用途。它说“嘿,我不在乎动态类型b是什么 - 我希望你调用BaseClass版本。”

于 2013-02-18T22:31:08.110 回答
1

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

b->BaseClass::Print();

您只需要求Print()从其父级调用方法 - BaseClass

于 2013-02-18T22:31:39.500 回答