C++ 怎么调用父类方法 C++ 作用域解析符解决同名函数遮蔽【继承】
发布时间 - 2026-01-30 00:00:00 点击率:次显式调用父类同名函数需用作用域解析符Base::func(),因子类同名函数会遮蔽父类版本;虚函数不解决编译期名字查找遮蔽问题;父类private函数不可在子类中通过Base::调用;默认参数在显式调用时仍生效。
用 :: 显式调用父类同名函数
当子类定义了和父类同名的函数(无论参数是否一致),父类版本会被遮蔽,obj.func() 默认只找子类里的。这时必须用作用域解析符 :: 指明调用路径:Base::func()。
常见错误是以为加 virtual 就能自动回退到父类实现——其实不会,虚函数只控制“动态绑定到哪个版本”,不解决“编译期名字查找被遮蔽”的问题。
- 必须写成
BaseClass::function_name(),不能只写::function_name() - 如果父类函数是
private,即使在子类内部也不能通过Base::func()调用 - 若父类函数带默认参数,子类显式调用时这些默认值依然生效
在子类构造函数初始化列表中调用父类构造函数
这不是“方法调用”,但常被混淆:父类构造函数只能在子类初始化列表里用 Base(args) 形式调用,不能在构造函数体里用 Base::Base(args) —— 后者语法错误,且会尝试创建临时对象。
典型误

Derived() {
Base(42); // ❌ 编译失败:这不是调用父类构造函数,而是声明一个临时 Base 对象
}
- 正确写法:
Derived() : Base(42) { } - 如果父类只有带参构造函数,子类必须显式调用,否则编译报错
no matching function for call to 'Base::Base()' - 初始化列表中的调用顺序固定为继承顺序,与书写顺序无关
虚函数重写后仍需调用父类逻辑怎么办
重写虚函数时,经常需要“先做父类的事,再加自己的逻辑”。此时必须手动写 Base::func(),编译器不会自动帮你补上。
例如:
class Base {
public:
virtual void log() { std::cout << "Base log\n"; }
};
class Derived : public Base {
public:
void log() override {
Base::log(); // ✅ 显式调用父类实现
std::cout << "Derived extra\n";
}
};- 漏掉
Base::log()是常见疏忽,尤其在调试时发现父类日志没输出 - 如果父类函数是纯虚函数(
= 0),则不能直接调用Base::pure_func(),除非它有定义(即有函数体) - 多层继承时,
GrandParent::func()也能跨级调用,只要访问权限允许
同名但不同签名的函数也会遮蔽父类所有重载版本
C++ 的名字查找在进入子类作用域后就停止了,哪怕子类只定义了一个 void f(int),父类的 f(double)、f(const char*) 全部不可见——这不是重载,是遮蔽。
修复方式只有两个:using Base::f; 引入全部重载,或逐个显式转发。
- 推荐写法:
class Derived : public Base { public: using Base::f; // ✅ 把父类所有 f 都带进来 void f(int x) { /* 新实现 */ } }; - 不写
using,又想保留某个父类重载?只能手动写转发:void f(double d) { Base::f(d); } - 注意:
using声明不能出现在函数体内,只能在类定义内、成员声明前
父类函数是否可访问、要不要显式调用、会不会被意外遮蔽——这些细节在重构或添加新函数时最容易出问题,尤其是多人协作项目里,一个新增的同名函数可能让其他模块静默失效。
# c++
# 作用域
# for
# 父类
# 子类
# 构造函数
# const
# char
# int
# double
# void
# 类作用域
# 继承
# 虚函数
# 纯虚函数
# using
# private
# function
# 对象
# 重构
# 这不是
# 重写
# 自己的
# 里用
# 不解决
# 也会
# 尤其是
# 就能
# 只能在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel怎么实现验证码(Captcha)功能
Laravel怎么上传文件_Laravel图片上传及存储配置
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何快速打造个性化非模板自助建站?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
如何在宝塔面板中创建新站点?
MySQL查询结果复制到新表的方法(更新、插入)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel怎么清理缓存_Laravel optimize clear命令详解
微信小程序 wx.uploadFile无法上传解决办法
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Python函数文档自动校验_规范解析【教程】
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Java类加载基本过程详细介绍
如何在阿里云香港服务器快速搭建网站?
如何在阿里云高效完成企业建站全流程?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
WEB开发之注册页面验证码倒计时代码的实现
如何快速生成专业多端适配建站电话?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
如何快速登录WAP自助建站平台?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
南京网站制作费用,南京远驱官方网站?
微信小程序 canvas开发实例及注意事项
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
如何获取上海专业网站定制建站电话?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
制作旅游网站html,怎样注册旅游网站?
Laravel如何实现用户注册和登录?(Auth脚手架指南)
iOS UIView常见属性方法小结
如何在IIS服务器上快速部署高效网站?
如何用y主机助手快速搭建网站?
Laravel如何配置Horizon来管理队列?(安装和使用)
如何确保FTP站点访问权限与数据传输安全?
Android okhttputils现在进度显示实例代码
如何利用DOS批处理实现定时关机操作详解

