当前位置: 首页 > news >正文

做网站的价格是多少临沂网站域名

做网站的价格是多少,临沂网站域名,网站建设狼雨,丰台体育馆网站建设在 C 继承中,重写(Override)、覆盖(Hide / 隐藏(Shadow) 是与函数继承相关的三个重要概念。尽管它们都涉及子类和父类中同名函数的行为,但它们的定义、用途和效果完全不同。本文档将详细介绍这三…

在 C++ 继承中,重写(Override)覆盖(Hide / 隐藏(Shadow) 是与函数继承相关的三个重要概念。尽管它们都涉及子类和父类中同名函数的行为,但它们的定义、用途和效果完全不同。本文档将详细介绍这三个概念的区别、代码示例以及最佳实践。


一、核心区别

术语英文名是否需要虚函数签名是否一致是否支持多态典型场景
重写Override实现多态,动态绑定
覆盖/隐藏Hide/Shadow否或签名不同子类定义同名函数,隐藏父类版本

二、详细说明与示例

1. 重写(Override)

定义:子类重新定义父类的虚函数(virtual),签名(函数名、参数列表、返回类型)必须完全一致,用于实现运行时多态(动态绑定)。

特点

  • 必须在父类中声明为 virtual
  • 子类函数可使用 override 关键字(C++11 引入,推荐使用)确保正确重写。
  • 通过基类指针或引用调用时,根据对象的实际类型执行子类或父类的实现。

代码示例

#include <iostream>class Base {
public:virtual void show() {std::cout << "Base show()" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived show()" << std::endl;}
};int main() {Base* ptr = new Derived();ptr->show(); // 输出:Derived show()ptr->Base::show(); // 输出:Base show()delete ptr;return 0;
}

说明

  • ptr 指向 Derived 对象,调用 show() 时执行子类的实现,体现多态。
  • 使用 override 关键字可避免签名错误,编译器会检查是否正确重写。

2. 覆盖/隐藏(Hide/Shadow)

定义:子类定义了一个与父类同名但签名不同(或非虚函数)的函数,导致父类的同名函数被“隐藏”。这不是多态,而是静态行为。

特点

  • 不需要父类函数是虚函数。
  • 子类函数签名可以与父类不同(参数列表或返回类型不同)。
  • 通过子类对象调用时,只调用子类的版本;通过父类指针/引用调用时,调用父类的版本。
  • 隐藏会影响所有父类的同名函数版本(包括重载版本)。

代码示例 1:非虚函数的隐藏

#include <iostream>class Base {
public:void show() {std::cout << "Base show()" << std::endl;}
};class Derived : public Base {
public:void show() { // 隐藏父类的 show()std::cout << "Derived show()" << std::endl;}
};int main() {Derived d;d.show(); // 输出:Derived show()Base* ptr = &d;ptr->show(); // 输出:Base show()(无多态)return 0;
}

代码示例 2:签名不同导致隐藏

#include <iostream>class Base {
public:virtual void show(int x) {std::cout << "Base show(int): " << x << std::endl;}
};class Derived : public Base {
public:void show() { // 隐藏父类的 show(int)std::cout << "Derived show()" << std::endl;}
};int main() {Derived d;d.show(); // 输出:Derived show()// d.show(10); // 错误:Base::show(int) 被隐藏Base* ptr = &d;ptr->show(10); // 输出:Base show(int): 10return 0;
}

解决隐藏问题

  • 使用 using Base::show; 在子类中引入父类的函数,恢复被隐藏的重载版本。
class Derived : public Base {
public:using Base::show; // 恢复父类的 show(int)void show() {std::cout << "Derived show()" << std::endl;}
};或者
d.Base::show(10); // 输出:Base show()//无论是 重写(Override)、隐藏(Hide) 还是其他情况,都可以通过 Base:: 显式指定作用域 来调用父类的函数。这是 C++ 中访问被覆盖或隐藏的基类成员的一种直接方式。

三、总结与对比

特性重写 (Override)覆盖/隐藏 (Hide/Shadow)
虚函数要求必须是 virtual不需要
签名要求必须完全一致可以不同
多态性支持(动态绑定)不支持(静态绑定)
调用行为由对象实际类型决定由指针/引用类型决定
典型问题忘记 virtual 或签名不匹配意外隐藏父类函数
解决方法使用 override 检查使用 using 恢复父类函数

四、最佳实践

  1. 重写时使用 override 关键字
    • 确保函数正确重写父类的虚函数,编译器会检查签名是否匹配。
    • 提高代码可读性和可维护性。
  2. 避免意外隐藏
    • 定义子类函数时,检查是否与父类同名。
    • 如果需要父类函数版本,使用 using Base::func; 引入。
  3. 明确设计意图
    • 如果需要多态,始终在父类中使用 virtual
    • 如果不需要多态,避免在子类中使用与父类同名的函数,以免混淆。
  4. 测试多态行为
    • 使用基类指针或引用测试函数调用,确保行为符合预期。

五、常见问题与解答

Q1:为什么子类的同名函数会隐藏父类的所有同名重载版本?

  • C++ 的名称查找规则(Name Lookup)在子类中找到同名函数后停止搜索,导致父类的所有同名函数被隐藏。

Q2:如何判断是重写还是隐藏?

  • 检查父类函数是否为

    virtual
    

    且签名是否一致:

    • 是虚函数且签名一致 → 重写。
    • 不是虚函数或签名不同 → 隐藏。

Q3:隐藏是 bug 还是特性?

  • 隐藏是 C++ 的语言特性,但常导致意外行为,因此需要小心使用。

通过理解重写与隐藏的区别,开发者可以更好地设计继承体系,避免常见的错误并实现预期的多态行为。

http://www.dtcms.com/a/494434.html

相关文章:

  • 深入理解 HTML `<label>` 的 `for` 属性:提升表单可访问性与用户体验
  • 大型语言模型(LLM)文本中提取结构化信息:LangExtract(一)
  • Flask应用改用Waitress运行
  • html css js网页制作成品——HTML+CSS辣条俱乐部网页设计(5页)附源码
  • Spring Boot 3零基础教程,Spring Boot WEB 开发 自动配置原理,笔记24
  • 大数据Spark(六十九):Transformation转换算子intersection和subtract使用案例
  • 郑州做网站狼牙有关网站建设文章
  • 【前端高频面试题】深入浏览器渲染原理:从输入 URL 到页面绘制的完整流程解析
  • 宿州网站建设贰聚思诚信wordpress菜单不兼容
  • C语言——深入解析C语言指针:从基础到实践从入门到精通(四)
  • Cursor 科技感的登录页面提示词
  • Ubuntu 24.04环境下的挂起转休眠
  • 【从0开始学习Java | 第21篇】网络编程综合练习
  • OpenCL初级教程
  • 【Spring AI】基于 sse 实现 MCP Server
  • vue使用限制仅允许上传 Excel 文件
  • dataease开发环境搭建
  • 一个网站开发周期wordpress导航条
  • 湖南城乡建设厅网站夜蝶直播app
  • list,咕咕咕!
  • iOS 混淆实战,多工具组合完成 IPA 混淆与加固(源码 + 成品 + 运维一体化方案)
  • Vue + Element UI 实现 el-scroll 滚动与鼠标滚轮监听全攻略
  • vue2版本的ruoyi-ui中使用vxe-table插件
  • 全国建设网站郑州seo优化公司
  • 用观察者模式通知UI刷新数据
  • 基于 AI 大模型的 UI 元素定位浏览器插件
  • Prism框架核心对象全解析
  • 阿里云服务器上部署Mosquitto
  • Android 设计模式实战手册(Kotlin 实战版)
  • Android thermal (5)_cooling device(下)