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 】
相关推荐:
WordPress 子目录安装中正确处理脚本路径的完整指南
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
php json中文编码为null的解决办法
Android利用动画实现背景逐渐变暗
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
linux写shell需要注意的问题(必看)
,交易猫的商品怎么发布到网站上去?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Bootstrap整体框架之JavaScript插件架构
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
北京专业网站制作设计师招聘,北京白云观官方网站?
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
IOS倒计时设置UIButton标题title的抖动问题
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
个人摄影网站制作流程,摄影爱好者都去什么网站?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何在建站之星网店版论坛获取技术支持?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
高防服务器:AI智能防御DDoS攻击与数据安全保障
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
UC浏览器如何设置启动页 UC浏览器启动页设置方法
昵图网官网入口 昵图网素材平台官方入口
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何在万网利用已有域名快速建站?
Android okhttputils现在进度显示实例代码
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何彻底卸载建站之星软件?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
轻松掌握MySQL函数中的last_insert_id()
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
nodejs redis 发布订阅机制封装实现方法及实例代码
长沙做网站要多少钱,长沙国安网络怎么样?
用yum安装MySQLdb模块的步骤方法
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
动图在线制作网站有哪些,滑动动图图集怎么做?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?

