我们已经讨论了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()在基类中是公共的。在运行时, 仅调用与指向的对象相对应的函数, 并且不检查访问说明符。因此, 派生类的私有函数通过基类的指针被调用。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。
推荐阅读
- 什么是C++中的数组衰减(如何预防?)
- 机器学习中的AutoML是什么()
- .NET中什么是即时(JIT)编译器
- 什么是Kivy(如何使用?)
- Python中整数的最大可能值是多少()
- 什么是OAuth(开放授权)(如何理解?)
- PHP中的stdClass是什么(如何使用?)
- php中|和||或运算符的区别是什么()
- 什么是终端、控制台、Shell程序和内核()