注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ksnowlv的博客

积土成丘,集腋成裘,坚持再坚持!

 
 
 

日志

 
 

C++_函数访问权限(编译期)与类对象的多态(运行期)  

2013-12-04 23:08:41|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

头文件声明如下:

#include <iostream>


class QBaseClass {

    

public:

    QBaseClass();

    ~QBaseClass();

    

public:

    virtual void funC();

};



class QAClass : public QBaseClass{

    

public:

    QAClass();

    ~QAClass();

    

private:

    virtual void funC();

};


实现文件中如下:

#pragma mark-----QBaseClass-------


QBaseClass::QBaseClass()

{

    

}


QBaseClass::~QBaseClass()

{

    

}


void QBaseClass::funC()

{

    printf("QBaseClass:funC!!!");

}


#pragma mark-----QAClass-------


QAClass::QAClass()

{

    

}


QAClass::~QAClass()

{

    

}


void QAClass::funC()

{

    printf("QAClass:funC!!!");

}



如下调用:

    QBaseClass* baseClass = new QAClass();

    baseClass->funC();

    

    delete baseClass;


日志输出如下:QAClass:funC!!!


   编译运行没有问题,居然正常访问到了B类中的私有方法。为什么会出现这样的结果呢?

          QBaseClass* baseClass = new QAClass();

  这里   baseClass  是一个   QAClass* , 所以就作为一个A类的指针参与了编译;因此从baseClass调用funC()在编译器眼中,就是调用了QBaseClass类的公开成员函数funC(),因此通过编译;

      而在运行时,由于多态作用 baseClass调用的funC()是派生类的f()成员函数。虽然这时funC()是private成员函数,但是由于“公有,私有,保护“这些访问控制是编译时的限制,在运行时无效,所以QAClass:: funC() 被成功调用。 

 

总结:

   一般来说外部对象访问类的私有成员,除非是友元,否则在编译的时候就会报错,但是上面那段代码却可以正常的编译通过。根源公有,私有,保护三种对成员函数的访问是在静态编译期的限定,在动态运行期是无效的。

       因此,在静态编译时,因为baseClass->funC()是按照QBaseClass的funC函数编译的,因此不会报错。而实际调用的是QAClass的funC()发生在运行期,也是正常的。

       C++区分类和对象:类是在编译期的概念,也是“访问权限”、“成员数据”、“成员函数”这几个概念的“作用域”。而对象的作用域是运行期。它包括类的实例、引用和指针。

  由这个问题,理解下编译期和运行期的概念。

  编译期指的是编译器在编译代码的时候,而运行期指的是程序运行的时候。


  评论这张
 
阅读(110)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018