Saturday, August 30, 2008

C++学习笔记(十) -- 通过多态访问私有成员

// -1156203886

#include <iostream>

using namespace std;

class Base
{
public:
virtual ~Base() {}

virtual void debugPrint() const
{
cout << "in Base" << endl;
}
};

class Derived : public Base
{
private:
void debugPrint() const
{
cout << "in Derived" << endl;
}
};

int main()
{
Base* aPo = new Derived();

aPo->debugPrint();

return 0;
}
以上代码的输出结果为"in Derived", 最开始我一直想不通为什么可以在类的外部访问一个私有成员函数, 经过一番搜索以后, 知道了原因.

这段代码的问题在于, 编译时是不会有错误的, 因为那个指针的静态类型是指向基类的对象的, 而基类中的虚函数是public的, 可以直接在外部访问, 这在编译器看来是没有一点错误的. 然而动态绑定却是在实际运行时, 这时候指针就转到子类里了, 它不会判断这个成员到底是私有还是公有的, 所以就输出了上面的结果. 有人把这看成是C++的一个bug, 也有人认为这符合OO的思想, 向类的用户隐藏了细节, 唯一不对的是这样的编程风格.

No comments:

Post a Comment