C ++中的函数指针和重写函数

时间:2013-02-18 22:26:58

标签: c++

我是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!"
}

2 个答案:

答案 0 :(得分:4)

(b->*myPtr)();行调用BaseClass::Print的{​​{1}}成员。 b是一个虚函数,因为你通过指针类型调用它,所以将以多态方式查找。也就是说,将找到根据动态类型BaseClass::Printb)的正确函数。

第二行DerivedClass显式调用b->BaseClass::Print();成员的Print成员函数。这正是这种语法的用途。它说“嘿,我不在乎BaseClass的动态类型 - 我希望你打电话给b版本。”

答案 1 :(得分:1)

即使你创建了DerivedClass类型的对象,它仍然有关于它继承的类的信息,在这种情况下是BaseClass。所以当你使用时:

b->BaseClass::Print();

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