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

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

[cpp]//鸟,可以飞
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;
}[/cpp]

上面的代码中,定义了一个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()函数并调用。

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

作者:JarvisChu
原文链接:C++实现通过基类指针调用子类的私有函数(易错点)
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

发表评论