2024年C C++最全C++ 基类私有成员会被继承吗_派生类可以继承基类的私有成员吗(1),论程序员成长的正确姿势

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


程序输出结果:



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
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






![img](https://img-blog.csdnimg.cn/img_convert/a9c931eb27f4921f2ae7becb531f994c.png)
![img](https://img-blog.csdnimg.cn/img_convert/4bfb2e05e294436bb8a8d03e643e0573.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值