news 2026/4/2 16:24:59

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/3/28 8:00:30

2026-01-26 全国各地响应最快的 BT Tracker 服务器(联通版)

数据来源:https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1http://211.75.205.188:80/announce广东潮州联通362udp://132.226.6.145:6969/announce北京联通613udp://152.53.152.105:54123/announce北京联通1284http://193.31.26.113:6969/announce北京联…

作者头像 李华
网站建设 2026/3/29 0:26:59

Emotion2Vec+ Large WebUI访问失败?7860端口配置问题排查

Emotion2Vec Large WebUI访问失败?7860端口配置问题排查 1. 问题现象与定位思路 你兴冲冲地执行了 /bin/bash /root/run.sh,终端里也看到了模型加载成功的提示,可当你在浏览器里输入 http://localhost:7860 时——页面却显示“无法访问此网…

作者头像 李华
网站建设 2026/3/25 3:16:13

掌握安卓应用管理全攻略:从安全下载到版本控制的实践指南

掌握安卓应用管理全攻略:从安全下载到版本控制的实践指南 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 在当今移动应用爆炸式增长的时代,安卓APK安全管理已成为每位用户和开发者必须掌握的核心技能。错误…

作者头像 李华
网站建设 2026/3/27 15:42:25

基于51单片机的智能家居 防火防盗 烟雾火灾报警GSM人体检测系统

目录系统概述核心功能模块硬件组成软件设计要点系统优化方向典型应用场景源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 基于51单片机的智能家居防火防盗系统整合了烟雾火灾报警、GSM通信和人体检测功能,实现环境…

作者头像 李华
网站建设 2026/3/30 23:47:38

FSMN-VAD完整部署教程:Ubuntu环境下从零开始实战

FSMN-VAD完整部署教程:Ubuntu环境下从零开始实战 1. 这是什么?一个能听懂“哪里在说话”的离线工具 你有没有遇到过这样的问题:一段5分钟的会议录音里,真正说话的时间可能只有2分半,其余全是咳嗽、翻纸、沉默和背景空…

作者头像 李华
网站建设 2026/4/1 20:54:47

如何用Snap Hutao提升90%游戏效率?从新手到高手的全面指南

如何用Snap Hutao提升90%游戏效率?从新手到高手的全面指南 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap…

作者头像 李华