文章目录

  • 1.派生类间接访问基类私有成员
  • 2.私有成员会被继承吗
  • 参考文献

1.派生类间接访问基类私有成员

在类的继承中,基类私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。但是,不能直接访问并不代表不能访问。在派生类还是能够通过调用基类的共有函数的方式来间接地访问基类的私有成员,包括私有成员变量和私有成员函数。考察如下程序。

#include <iostream>
using namespace std;class A {int i;void privateFunc() {cout<<"this is a private function of base class"<<endl;}public:A(){i=5;}int getI() {return i;}void usePrivateFunc() {privateFunc();}
};class B:public A {public:void printBaseI() {cout<<getI()<<endl;}void usePrivateFunction() {usePrivateFunc();}
};int main() {B b;b.printBaseI();b.usePrivateFunction();
}

程序输出结果:

5
this is a private function of base class

在类 B 中,由于基类A的成员变量i和成员函数 privateFunc() 都是私有的,所以在类 B 的成员函数中无法直接访问到它们。但是,由于类 A 的公有成员函数 getI() 可以访问到私有成员变量 i,而 usePrivateFunction() 可以访问私有成员函数 privateFunc(),所以在类 B 中通过调用函数 getI() 和 usePrivateFunc() 就可以间接访问基类 A 中的私有成员。

2.私有成员会被继承吗

如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?其实,这些私有成员的确是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。考察如下程序,通过一种特殊的方式访问了类的私有成员。

#include <iostream>
using namespace std;class A {int i;void privateFunc(){cout<<"this is a private function of base class"<<endl;}public:A(){i=5;}
};class B:public A {public:void printBaseI() {int* p=reinterpret_cast<int*>(this);//获取当前对象的首地址cout<<*p<<endl;}void usePrivateFunction() {void (*func)()=NULL;_asm{mov eax,A::privateFunc;mov func,eax;}func();}
};int main() {B b;b.printBaseI();b.usePrivateFunction();
}

程序输出结果:

5
this is a private function of base class

(1)虽然类 A 没有提供访问私有成员变量 i 的公有方法,但是在类 A(以及类 A 的派生类)对象中,都包含变量 i。
(2)虽然类 A 并没有提供访问私有成员函数 privateFunc() 的公有函数,但是在程序代码区依然存有函数 privateFunc() 的代码,通过内联汇编获取该函数的入口地址,仍然可以顺利调用。

综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员,读者可自行考证。只不过受到 C++ 语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。


参考文献

[1] 陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.C8.1

C++ 基类私有成员会被继承吗相关推荐

  1. 6-4 派生类使用基类的成员函数

    6-4 派生类使用基类的成员函数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 按要求完成下面的程序: 1.定义一个Animal类,成员包括: (1)整数类型的私有数据成 ...

  2. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

  3. PetShop 4.0知识点:base 关键字用于从派生类中访问基类的成员

    //base 关键字用于从派生类中访问基类的成员: //调用基类上已被其他方法重写的方法. //指定创建派生类实例时应调用的基类构造函数. //基类访问只能在构造函数.实例方法或实例属性访问器中进行. ...

  4. C++中直接存取类私有成员[360度]

    本文谈到的问题是,在C++中究竟有没有办法访问类的私有成员,以及如何实现.主要针对菜鸟,老鸟们就不要看了. 读到<C++编程思想>48页,"3.4 对象布局"一节时,看 ...

  5. java 私有成员方法_Java Reflection 教程(7):类私有成员变量和方法

    一般来说,不可以访问类的私有成员变量和调用类的私有方法.但通过Java Reflection API可以绕过这个限制,前面使用的getMethods, getFields,getConstructor ...

  6. 基类的析构函数不能被继承。_为什么要把C++类中的析构函数声明为虚函数?

    如题,当一个类为基类的时候,通常其析构函数被声明为虚函数,这是为啥? class BaseCls { public: BaseCls() { printf("BaseCls()n" ...

  7. 在保护继承中基类的共有成员_C++学习刷题13--继承的实现、继承的方式

    一.前言 本部分为C++语言刷题系列中的第13节,主要讲解这几个知识点:继承的实现.继承的方式.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:继承的实现,可以理解派生类拥有成 ...

  8. C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨

     原文: http://blog.csdn.net/zgjxwl/article/details/4804233 1.public继承方式下 #include <iostream>   ...

  9. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 publ ...

最新文章

  1. MySQL面试题 | 附答案解析(三)
  2. scrapy中的下载器中间件
  3. 使用HSRP和SLB实现服务器群负载均衡和冗余
  4. MySQL 高级 - 存储过程 - 语法 - loop循环
  5. ABAP formula
  6. 人寿保险分红型的十年能取出来吗?
  7. 微信公众号发送模版消息 Java实现
  8. 论文实录 | 毕业设计如何做需求分析?
  9. 最近出现Matlab2010b点击matlab.exe运行时,不断提示Activate MathWorks Software,无法正常使用
  10. 小程序在政务服务平台建设中如何发挥价值
  11. feedsky-对他扫兴至极
  12. Xcode真机调试 could not lunch failed to get reply to handshake packet
  13. Linux -- fflush函数
  14. 企鹅,大鱼,百家,头条到底那个收益高,新手该怎么来做?
  15. 软酷优计划java考试复习题_软酷题
  16. 一篇文章让你掌握HTML+CSS
  17. Long与Integer之间的转换产生的问题
  18. Java中出现[Ljava.lang.String的问题
  19. R语言文本挖掘相关包介绍
  20. 软件测试中Bug的生命周期以及Bug的严重等级

热门文章

  1. 信创产业已成现象级新风口 代码“源头”安全该如何守护?
  2. 以物载道,探享生活艺术,LEXUS雷克萨斯开启中国新匠精神巡展
  3. 《众妙之门——用户体验设计的秘密》一2.3 触摸至上的设计
  4. Golang学习(10)——bufio包
  5. 微信昵称emoj表情保存到mysql数据库时报错怎么解决?
  6. Android中ContentProvider组件详解
  7. 根据中心点、半径长度和角度画点
  8. 淘宝双12惊喜——“寻”千兆,万兆光模块等你来
  9. 【Vegas原创】ProC环境搭建
  10. SQLite指南(2) -- 帮助及编译SQLite