Java中子类重写父类方法权限不能更小,C++却没有这个要求,来看看这段程序会输出什么
#include <cstdio>
class CBase{
public:
virtual void show(){
puts("CBase");
}
};
class CDerived : public CBase{
private:
virtual void show(){
puts("Derived");
}
};
int main()
{
CBase* pBase = new CDerived;
pBase->show();
dynamic_cast<CDerived*>(pBase)->show();
delete pBase;
CDerived* pDerived = new CDerived;
pDerived->show();
static_cast<CBase*>(pDerived)->show();
delete pDerived;
return 0;
}
没错,是编译错误,编译器提示dynamic_cast<CDerived*>(pBase)->show;和pDerived->show();这两行有问题,编译器提示说子类的`virtual void CDerived::show()' is private,这是在意料之内的事。
但是,发现没有,编译器认为pBase->show();这一句没有问题呢,我们知道虚函数的调用是运行期绑定,父类指针会调用子类重写的虚函数,但是在子类中,show()这个成员函数是private的,不应该被调用才对啊,为什么还会通过编译呢?我们注释掉编译器报错的那两行来看看