我们已经讨论了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;
}
下面的程序呢?
#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()在基类中是公共的。在运行时, 仅调用与指向的对象相对应的函数, 并且不检查访问说明符。因此, 派生类的私有函数通过基类的指针被调用。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。
评论前必须登录!
注册