个性化阅读
专注于IT技术分析

当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;
}

下面的程序呢?

#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()在基类中是公共的。在运行时, 仅调用与指向的对象相对应的函数, 并且不检查访问说明符。因此, 派生类的私有函数通过基类的指针被调用。

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

赞(0)
未经允许不得转载:srcmini » 当C++中对派生类方法给予更严格的访问时会发生什么?

评论 抢沙发

评论前必须登录!