C++_隐藏

server/2024/10/18 21:25:23/

理解重写(Overriding)、重载(Overloading)以及隐藏(Hiding)之间的关系和区别是很重要的。以下是一个简单的C++示例代码,帮助解释它们的概念:

#include <iostream>
using namespace std;// 基类 Base
class Base {
public:// 基类的普通函数,可以被隐藏或重载void display() {cout << "Base::display() called" << endl;}// 虚函数可以被重写(Overridden),但不能被重载(Overloaded)或隐藏(Hidden)virtual void show() {cout << "Base::show() called" << endl;}// 静态函数,不能被重写static void print() {cout << "Base::print() called" << endl;}
};// 派生类 Derived
class Derived : public Base {
public:// 子类中的同名函数,隐藏基类的同名函数void display() {cout << "Derived::display() called" << endl;}// 重写基类的虚函数void show() override {cout << "Derived::show() called" << endl;}// 重载show函数,与基类的虚函数无关void show(int num) {cout << "Derived::show(int) called with " << num << endl;}// 静态函数,与基类的静态函数无关,隐藏无意义static void print() {cout << "Derived::print() called" << endl;}
};int main() {Base b;Derived d;// 隐藏示例b.display();  // 输出 Base::display() calledd.display();  // 输出 Derived::display() called// 重写和多态示例b.show();     // 输出 Base::show() calledd.show();     // 输出 Derived::show() called// 重载示例d.show(5);    // 输出 Derived::show(int) called with 5// 静态函数示例Base::print();   // 输出 Base::print() calledDerived::print();  // 输出 Derived::print() calledreturn 0;
}

代码解释

  1. 隐藏(Hiding)

    • 在派生类中定义与基类同名的非虚函数或静态函数时,派生类的函数会隐藏基类中的同名函数。在示例中,Derived::display()Derived::print() 分别隐藏了 Base::display()Base::print()
  2. 重写(Overriding)

    • 在派生类中重新定义基类的虚函数,这样可以在运行时动态调用派生类的实现。在示例中,Derived::show() 重写了 Base::show(),允许通过基类指针或引用调用时产生多态效果。
  3. 重载(Overloading)

    • 在同一个作用域内,定义多个同名函数但参数列表不同,称为重载。重载的函数可以是虚函数、非虚函数或静态函数。在示例中,Derived::show(int num) 重载了 Derived::show(),这两个函数在参数列表上有所区别。

总结

  • 隐藏(Hiding):子类中的同名函数会隐藏父类中的同名函数,无论是虚函数、非虚函数还是静态函数。
  • 重写(Overriding):子类可以重新定义父类的虚函数,允许在运行时动态调用子类的实现,实现多态性。
  • 重载(Overloading):在同一作用域中,可以定义多个同名函数但参数列表不同的函数,用来处理不同的参数类型或数量。

静态函数相关:

  1. 静态函数不受重写影响

    • 静态函数在类的继承中不会被重写。无论在基类中如何定义静态函数,在派生类中重新定义同名的静态函数,不会形成重写关系。实际上,它们只是同名函数而已,没有多态性的特性。
  2. 静态函数与隐藏

    • 静态函数在类的继承中也不能被隐藏。如果在派生类中定义了与基类同名的静态函数,它们不会相互隐藏,而是分别存在于各自的作用域中。这与非静态函数的隐藏行为不同。
  3. 静态函数的调用

    • 静态函数可以通过类名直接调用,不需要对象的实例。这使得静态函数在面向对象编程中常用于不需要依赖于特定对象状态的操作,例如工具函数或者与类实例无关的全局操作。

所以,静态函数的存在意义在于它们在类的继承层次中有着特定的行为表现,与非静态函数(包括普通成员函数和虚函数)有所区别,能够帮助理解和展示类的静态成员在继承中的不同行为。

帮助理解隐藏的代码:

#include<iostream>
using namespace std;classA{
public:void fun1(int i, int j){cout <<"A::fun1() : " << i <<" " << j << endl;}
};
classB : public A{
public://隐藏void fun1(double i){cout <<"B::fun1() : " << i << endl;}
};
int main(){B b;b.fun1(5);//调用B类中的函数b.fun1(1, 2);//出错,因为基类函数被隐藏system("pause");return 0;
}

http://www.ppmy.cn/server/96581.html

相关文章

LeetCode面试题Day3|LeetCode121 买卖股票的最佳时机、LeetCode122 买卖股票的最佳时机Ⅱ

题目1&#xff1a; 指路&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;121 买卖股票的最佳时机 方法一&#xff1a;贪心 思路与分析&#xff1a; 对于买卖股票的操作&#xff0c;只有买入和卖出两种操作&#xff0c;而利益最大化在理想状态下无非是贪心买卖&…

java之WIFI模块实现文件传输(开源)

AndroidManifest这里要获取到权限,所以要导入: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name"android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name"…

2024.8.2(MySQL)

一、mysql 1、下载mysql软件包 [rootmysql ~]# yum -y install wget [rootmysql ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2、解压 [rootmysql ~]# tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3、安装…

如何通过OpenCV判断图片是否包含在视频内?

要判断图片是否包含在视频内&#xff0c;可以使用计算机视觉技术和图像处理方法。这通常涉及特征匹配或模板匹配。以下是一个基于OpenCV的解决方案&#xff0c;通过特征匹配的方法来实现这一目标。 步骤概述 读取视频和图片&#xff1a; 使用OpenCV读取视频文件和图片文件。 …

LoRA 的基本原理和操作步骤

Low-Rank Adaptation (LoRA) 是一种技术&#xff0c;用于在有限的计算资源和训练数据下&#xff0c;针对特定任务微调大型预训练模型。LoRA 的核心思想是将原始模型的参数矩阵分解为两个低秩矩阵&#xff0c;从而减少需要微调的参数量。下面详细讲解 LoRA 的原理和具体过程。 …

Linux下部署python记录

目录 前言 部署过程 安装python 收集依赖 安装依赖 上传代码到服务器 部署 打包部署 直接运行代码 nohub使用 总结 最终结果 更好的方法 遇到的问题 前言 在本地实现了一个python写的webapi&#xff0c;现在要部署到一个外网服务器测试&#xff0c;奈何服务器资…

3.Java面试题之AQS

1. 写在前面 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是Java并发包&#xff08;java.util.concurrent&#xff09;中的一个抽象类&#xff0c;用于实现同步器&#xff08;如锁、信号量、栅栏等&#xff09;。AQS提供了一种基于FIFO队列的机制来管理线程的竞争和…

gym/Gymnasium强化学习玩推箱子游戏

gym/Gymnasium强化学习玩推箱子游戏 gym 框架 源码 https://github.com/openai/gym 文档 https://www.gymlibrary.dev/ 自 2021 年以来一直维护 Gym 的团队已将所有未来的开发转移到 Gymnasium&#xff0c;这是 Gym 的替代品&#xff08;将 gymnasium 导入为 gym&#xff09;…