0

0

c++如何实现继承与派生_c++ public继承权限详解【核心】

尼克

尼克

发布时间:2026-02-14 13:18:11

|

184人浏览过

|

来源于php中文网

原创

派生类访问基类成员报错的根本原因是继承方式影响成员可见性:public继承保持原访问级,protected继承将非private成员转为protected,private继承全转为private。

c++如何实现继承与派生_c++ public继承权限详解【核心】

派生类里访问基类成员为什么报错?

根本原因不是语法写错了,而是继承方式决定了基类成员在派生类中的可见性。比如基类有个 protected 成员,在 public 继承下它在派生类内部可访问;但换成 private 继承,它就变成派生类的私有成员,外部不可见——连派生类自己的成员函数都可能被编译器拦住。

  • public 继承:基类的 public 成员在派生类中仍是 publicprotected 保持 protectedprivate 始终不可见
  • protected 继承:基类所有非 private 成员在派生类中都变成 protected
  • private 继承:基类所有非 private 成员在派生类中都变成 private

常见错误现象:error: 'xxx' is inaccessible within this context,十有八九是继承方式和访问权限不匹配。别急着改基类,先看你是怎么写的继承声明。

public 继承下子类对象能直接调用父类 public 函数吗?

能,但前提是该函数没被子类同名函数隐藏(注意:不是重写)。C++ 默认不会自动重写,必须显式加 virtualoverride 才构成多态行为。

  • 如果子类定义了和父类同名、同参的函数,且父类没声明 virtual,那父类函数会被完全隐藏,哪怕参数类型略有不同
  • 想保留父类接口又扩展逻辑,要么用 using Base::func; 在子类中引入,要么老老实实加 virtual
  • 不加 virtualpublic 继承,只是“接口复用”,不是“运行时多态”

示例:class Derived : public Base { void func(); }; —— 这样写后,Derived d; d.func(); 调的是子类的,Base& b = d; b.func(); 调的才是父类的(除非 func 是虚函数)。

立即学习C++免费学习笔记(深入)”;

Lovable
Lovable

AI辅助编程工具

下载

继承时构造函数不自动调用,怎么确保基类初始化正确?

派生类构造函数必须显式调用基类构造函数,否则编译器会尝试调用基类默认构造函数;如果基类没有默认构造函数,就会报错:no matching function for call to 'Base::Base()'

  • 在派生类构造函数初始化列表里写 Base(args),顺序无关紧要,但必须存在
  • 基类构造函数执行早于派生类构造函数体,所以不能在派生类构造函数体内“补救”初始化
  • 如果基类构造函数是 explicit 的,也不能省略初始化列表,更不能用赋值方式绕过

容易踩的坑:把初始化列表写成 Base(args) {}(正确),误写成 Base(args); 在函数体内(这是非法语句,不是调用)。

派生类对象赋值给基类指针安全吗?

安全,这是 public 继承的核心价值之一,也是多态的前提。但要注意指针类型决定你能调用哪些函数——静态类型是基类指针,就只能看到基类声明过的接口。

  • 若基类析构函数不是 virtual,用基类指针 delete 派生类对象会导致派生部分内存泄漏
  • 基类指针转回派生类指针必须用 dynamic_cast(需开启 RTTI),且仅对多态类型有效;static_cast 强转不检查,风险自担
  • 返回基类指针/引用的函数,如果实际返回派生类对象,调用者仍需依赖虚函数机制才能触发子类逻辑

最关键的细节往往藏在析构函数上:只要可能通过基类指针销毁对象,~Base() 就必须是 virtual。这点一旦漏掉,问题可能延迟到程序退出时才暴露。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

21

2025.11.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

181

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

114

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1440

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

361

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2210

2025.12.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.3万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号