news 2026/6/9 20:02:17

C++继承踩坑:为什么子类不能直接访问父类的private成员?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++继承踩坑:为什么子类不能直接访问父类的private成员?

文章目录

  • 1、前景提要
  • 2、场景还原
  • 3、问题根源
  • 4、修复方案
    • 标题方案1:将父类成员改为 protected
    • 方案2:在父类中提供 get 方法
  • 总结

1、前景提要

最近在写一个自定义异常类的代码时,我遇到了一个经典的C++继承问题。当时我觉得既然子类继承了父类,就应该像访问自己的私有成员一样,直接访问父类的private成员,结果编译器直接报错了。今天就来复盘一下这个踩坑过程,顺便把C++继承的访问权限规则彻底理清楚。


提示:以下是本篇文章正文内容,下面案例可供参考

2、场景还原

  • 我写了一个父类Exception,它包含两个private成员:_errmsg(错误信息)和_id(错误码)。
  • 然后我又写了一个子类SqlException继承用它,用来处理SQL相关的异常。
  • 在子类的what成员函数中,我想把父类的_errmsg拼接到自己的错误信息里,于是写了这样的代码:
classException//基类{public:Exception(conststring&errmsg,intid):_errmsg(errmsg),_id(id){}private:string _errmsg;int_id;};//classSqlException:publicException{public:SqlException(conststring&errmsg,intid,conststring&sql):Exception(errmsg,id),_sql(sql){}virtualstringwhat()const{string str="SqlException";str+=_errmsg;str+="->";str+=_sql;returnstr;}private:conststring _sql;};

结果编译器直接给我报了一个错

'_errmsg'is aprivatemember of Exception

我当时就懵了:我不是已经继承了父类了吗,为什么不能直接使用它的私有成员?

3、问题根源

后来我才明白,C++的继承并不是把父类的所有成员都“复制”给子类,而是有严格的访问权限控制:

父类成员权限 子类继承后访问权限(public继承)

父类成员权限子类继承后访问权限(public继承
public保持public,外部和子类都能访问
protected保持protected ,只有子类能访问
private子类完全无法直接访问,只能通过父类的 public / protected 接口间接访问

简单来说,父类的 private 成员是父类的“私有财产”,即使是它的子类也无权直接触碰。
这个设计是为了保证封装性,让父类可以自由修改自己的内部实现,而不影响子类。

4、修复方案

想通了原理之后,我就找到了两种可行的修复方法:

标题方案1:将父类成员改为 protected

这是最简单直接的方式,把父类的 _errmsg 和 _id 从 private 改成 protected,这样子类就可以直接访问了

classException//基类{public:Exception(conststring&errmsg,intid):_errmsg(errmsg),_id(id){}protected://privatestring _errmsg;int_id;};

方案2:在父类中提供 get 方法

如果不想破坏父类的封装性,可以在父类里提供 public 的访问接口,让子类通过这些方法间接获取私有成员:

classException{private:string _errmsg;int_id;public:stringgetErrMsg()const{return_errmsg;}intgetId()const{return_id;}// ...};

然后在子类这样调用

virtualstringwhat()const{return"SqlException: "+getErrMsg();}

总结

这次踩坑让我深刻理解了:继承不等于拥有父类的私有成员。

C++的访问权限规则不是为了故意刁难开发者,而是为了让代码更健壮、更易于维护。
遵守这些规则,能让我们写出更符合面向对象设计思想的代码。

如果你也遇到了类似的问题,希望这篇文章能帮你少走弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 3:53:37

探索GDScript逆向工程:从字节码到完整项目恢复的技术实践

探索GDScript逆向工程:从字节码到完整项目恢复的技术实践 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/gh_mirrors/gd/gdsdecomp GDScript反编译与资源提取是Godot引擎生态中一项关键技术能力,它能…

作者头像 李华
网站建设 2026/6/2 4:08:01

Z-Image-Turbo企业宣传应用:发布会海报自动生成实战案例

Z-Image-Turbo企业宣传应用:发布会海报自动生成实战案例 1. 为什么企业需要一张好海报? 你有没有遇到过这样的场景:公司下周要开新品发布会,市场部同事凌晨两点还在改第17版海报——背景太灰、产品图不够突出、文案排版总差一口…

作者头像 李华
网站建设 2026/6/9 15:01:02

Qwen3-1.7B + LangChain:快速构建对话机器人

Qwen3-1.7B LangChain:快速构建对话机器人 1. 为什么是Qwen3-1.7B?轻量不等于妥协 你是否试过在本地部署一个真正能用的大模型,结果被显存爆满、响应迟缓、配置复杂劝退?很多开发者卡在第一步:不是模型不够强&#…

作者头像 李华
网站建设 2026/5/28 2:49:18

COMET:革新机器翻译质量评估的智能解决方案

COMET:革新机器翻译质量评估的智能解决方案 【免费下载链接】COMET A Neural Framework for MT Evaluation 项目地址: https://gitcode.com/gh_mirrors/com/COMET 在全球化信息交互的浪潮中,机器翻译质量评估长期面临效率与准确性难以兼顾的困境…

作者头像 李华
网站建设 2026/5/22 16:18:56

YOLOv9实战案例:仓储物流分拣系统部署完整流程

YOLOv9实战案例:仓储物流分拣系统部署完整流程 在现代智能仓储场景中,分拣效率直接决定订单履约速度。传统人工分拣面临疲劳误判、夜间识别困难、高峰时段人力不足等问题;而早期视觉方案又常受限于小目标漏检、密集堆叠遮挡、光照变化干扰等…

作者头像 李华
网站建设 2026/6/10 11:14:29

TurboDiffusion显存优化技巧:量化线性层启用实战案例

TurboDiffusion显存优化技巧:量化线性层启用实战案例 1. 为什么显存优化对TurboDiffusion如此关键 TurboDiffusion不是普通视频生成工具,它是一套真正把“秒级生成”从论文变成现实的加速框架。你可能已经看过那些令人震撼的演示——输入一句话&#x…

作者头像 李华