// -1156203886以上代码的输出结果为"in Derived", 最开始我一直想不通为什么可以在类的外部访问一个私有成员函数, 经过一番搜索以后, 知道了原因.
#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;
}
这段代码的问题在于, 编译时是不会有错误的, 因为那个指针的静态类型是指向基类的对象的, 而基类中的虚函数是public的, 可以直接在外部访问, 这在编译器看来是没有一点错误的. 然而动态绑定却是在实际运行时, 这时候指针就转到子类里了, 它不会判断这个成员到底是私有还是公有的, 所以就输出了上面的结果. 有人把这看成是C++的一个bug, 也有人认为这符合OO的思想, 向类的用户隐藏了细节, 唯一不对的是这样的编程风格.
No comments:
Post a Comment