C++实现通过基类指针调用子类的私有函数(易错点)

C++实现通过基类指针调用子类的私有函数(易错点)

Mar 12, 2014
Coding
C++

请看下面的例子,它成功调用了类的私有成员函数。

// 鸟,可以飞
class Bird {
public:
    virtual void fly(){cout<<"Bird fly"<<endl;};
};

// 鸵鸟,是鸟,但不可飞
class Ostrich: public Bird
{
private:
    void fly(){cout<<"Ostrich cannot fly"<<endl;};
};

int main(int argc, char* argv[])
{
    Ostrich a;
    //a.fly() //私有成员函数,无法调用

    Bird* b = &a;
    b->fly(); //通过基类指针调用,实际调用的是Ostrich的私有函数fly,输出Ostrich cannot fly
    return 0;
}

上面的代码中,定义了一个Bird类和一个Ostrich类。Bird类中有一个虚函数fly(), Ostrich类中覆写了fly()函数,并设置为了private。

上述代码的本意是让 Ostrich类的对象 失去fly() 功能。定义一个Ostrich对象a,a.fly()无法调用,表面上看已经达到了目的。

但是如果使用基类Bird指针b指向子类Ostrich的对象,再调用 b->fly() 。实际上调用的就是Ostrich的私有函数fly,输出Ostrich cannot fly 。因为Bird类 fly() 为虚函数,所以调用b->fly()时,会找到子类Ostrich的fly()函数并调用。

这是一个很有意思的例子,我们竟然能够调用了类的私有成员函数。当然,如果不注意,这也会成为一个易出错的地方。