当C++中对派生类方法给予更严格的访问时会发生什么?

我们已经讨论了Java中的类似主题这里。与Java不同, C++允许对派生类方法进行更严格的访问。例如, 以下程序可以正常编译。

#include< iostream> using namespace std; class Base { public : virtual int fun( int i) { } }; class Derived: public Base { private : int fun( int x){} }; int main() {}

在上面的程序中, 如果将main()更改为以下代码, 则会得到编译器错误, 因为fun()在派生类中是私有的。
int main() { Derived d; d.fun(1); return 0; }

【当C++中对派生类方法给予更严格的访问时会发生什么?】下面的程序呢?
#include< iostream> using namespace std; class Base { public : virtual int fun( int i) { cout < < "Base::fun(int i) called" ; } }; class Derived: public Base { private : int fun( int x){ cout < < "Derived::fun(int x) called" ; } }; int main() { Base *ptr = new Derived; ptr-> fun(10); return 0; }

输出如下:
Derived::fun(int x) called

在上述程序中, 私有函数” Derived::fun(int)” 通过基类指针被调用, 该程序运行良好, 因为fun()在基类中是公共的。访问指定符在编译时检查, 并且fun()在基类中是公共的。在运行时, 仅调用与指向的对象相对应的函数, 并且不检查访问说明符。因此, 派生类的私有函数通过基类的指针被调用。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

    推荐阅读