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

长沙建站公司效果/google秒收录方法

长沙建站公司效果,google秒收录方法,做网站多钱,单位网站建设服务概念 C中的多态性是面向对象编程的一个重要特征,它允许我们通过一个基类的指针或引用来操作不同派生类的对象。多态性增强了代码的灵活性和可扩展性。主要分为两种类型:编译时多态(静态多态)和运行时多态(动态多态&am…

概念

C++中的多态性是面向对象编程的一个重要特征,它允许我们通过一个基类的指针或引用来操作不同派生类的对象。多态性增强了代码的灵活性和可扩展性。主要分为两种类型:编译时多态(静态多态)和运行时多态(动态多态)。

编译时多态(静态多态)

编译时多态通常通过函数重载和运算符重载实现。编译器在编译时决定调用哪个函数。

#include <iostream>  
using namespace std;  class Print {  
public:  void display(int i) {  cout << "Displaying integer: " << i << endl;  }  void display(double d) {  cout << "Displaying double: " << d << endl;  }  
};  int main() {  Print p;  p.display(5);     // 调用display(int)  p.display(5.5);   // 调用display(double)  return 0;  
}

运行时多态(动态多态)

运行时多态通过虚函数实现,允许在运行时根据对象的实际类型调用相应的函数。当我们定义一个虚函数并在子类中重写它时,基类的指针或引用可以指向子类的对象,并根据实际对象的类型调用相应的函数。

#include <iostream>  
using namespace std;  class Base {  
public:  virtual void show() { // 虚函数  cout << "Base class show function called." << endl;  }  virtual ~Base() {} // 虚析构函数  
};  class Derived : public Base {  
public:  void show() override { // 重写虚函数  cout << "Derived class show function called." << endl;  }  
};  int main() {  Base* basePtr;          // 基类指针  Derived derivedObj;     // 派生类对象  basePtr = &derivedObj;  // 指向派生类对象  basePtr->show();        // 调用派生类的show()  return 0;  
}

原理

1.虚函数
虚函数是在基类中使用virtual关键字声明的函数,用于支持运行时多态。通过虚函数,可以在基类中定义接口,而在派生类中实现具体的逻辑。当使用基类指针或引用指向派生类对象并调用该虚函数时,C++会根据对象的真实类型来调用相应的函数实现。

2. 虚表(vtable)
每个包含虚函数的类在运行时会有一个虚表(vtable)。这个虚表是一个函数指针数组,存储了该类的所有虚函数的地址。当创建一个对象时,编译器会为该对象生成一个指向其类虚表的指针,称为虚指针(vptr)。

3. 运行时过程
运行时多态的过程大致如下:

  • 1.声明和定义:在基类中用virtual关键字声明虚函数,在派生类中重写该虚函数。

  • 2.对象创建:当基类指针或引用指向派生类对象时,派生类对象的虚指针会指向派生类的虚表。

3.函数调用:

当通过基类指针或引用调用虚函数时,程序会查找对象的虚表,找到对应虚函数的地址并执行。这是一个动态过程,因为决定调用哪个函数是在运行时而不是编译时。

#include <iostream>  
using namespace std;  class Base {  
public:  virtual void show() {  // 虚函数  cout << "Base class show function called." << endl;  }  virtual ~Base() {}  // 虚析构函数  
};  class Derived : public Base {  
public:  void show() override {  // 重写虚函数  cout << "Derived class show function called." << endl;  }  
};  void demonstratePolymorphism(Base* b) {  b->show();  // 调用虚函数  
}  int main() {  Base baseObj;        // 基类对象  Derived derivedObj;  // 派生类对象  demonstratePolymorphism(&baseObj);       // 调用基类的 show  demonstratePolymorphism(&derivedObj);    // 调用派生类的 show  return 0;  
}
  • 创建基类Base和派生类Derived,Derived重写了Base中的虚函数show。
  • 函数demonstratePolymorphism接受基类指针作为参数,调用show函数。实际上,将根据指针所指向的对象类型来调用相应的版本。
  • 当调用show时,即使传入的是基类指针,实际执行的是派生类的show。

重载,重写,隐藏

重载(Overloading)

重载是指在同一作用域内可以定义多个同名函数,只要它们的参数列表(参数的数量或类型)不同就可以。重载发生在同一个类中,也可以在继承关系中的不同类中的同名函数。

#include <iostream>  
using namespace std;  class Math {  
public:  // 重载:不同参数数量和类型  int add(int a, int b) {  return a + b;  }  double add(double a, double b) {  return a + b;  }  int add(int a, int b, int c) {  return a + b + c;  }  
};  int main() {  Math math;  cout << math.add(1, 2) << endl;        // 调用 add(int, int)  cout << math.add(1.5, 2.5) << endl;    // 调用 add(double, double)  cout << math.add(1, 2, 3) << endl;     // 调用 add(int, int, int)  return 0;  
}

在上面的例子中,add函数被重载,具有不同的参数类型和数量。

重写(Overriding)

重写是指在派生类中重新定义基类中已经声明的虚函数。重写允许派生类为基类的虚函数提供特定的实现。重写是在继承关系中发生的,它通常涉及到基类的虚函数和派生类的同名函数。

#include <iostream>  
using namespace std;  class Base {  
public:  virtual void show() {  // 虚函数允许重写  cout << "Base class show function." << endl;  }  
};  class Derived : public Base {  
public:  void show() override {  // 重写基类的虚函数  cout << "Derived class show function." << endl;  }  
};  int main() {  Base* basePtr;  Derived derived;  basePtr = &derived;  basePtr->show();  // 调用 Derived::show()  return 0;  
}

在这段代码中,Derived类中的show函数重写了Base类中的虚函数show。通过基类指针调用时,会执行派生类的实现。

隐藏(Hiding)

隐藏是指在派生类中定义一个与基类中同名的成员(可以是函数或变量),这会遮蔽基类中的所有同名成员。隐藏不是重载,也不是重写,它发生在同一作用域内,并且会隐藏基类中的所有同名函数和变量,不论其参数和返回类型。

#include <iostream>  
using namespace std;  class Base {  
public:  void func(int i) {  cout << "Base func with int: " << i << endl;  }  void func(double d) {  cout << "Base func with double: " << d << endl;  }  
};  class Derived : public Base {  
public:  void func(int i) {  // 该函数隐藏了 Base 中的所有 named func  cout << "Derived func with int: " << i << endl;  }  
};  int main() {  Derived d;  d.func(10);         // 调用 Derived::func(int)  // d.func(3.14);    // 错误:Base::func(double) 被隐藏,不能调用  return 0;  
}

在这个例子中,Derived类中的func(int)函数隐藏了Base类中的所有同名成员函数,尽管基类中还有一个func(double)。因此,尝试调用d.func(3.14)将导致编译错误。

总结

  • 重载(Overloading):同一个作用域中,可以有多个同名函数,参数列表不同。
  • 重写(Overriding):在派生类中重新定义基类中的虚函数,允许多态。
  • 隐藏(Hiding):在派生类中定义与基类中同名的成员,遮蔽基类中的所有同名成员。

相关文章:

C++多态性

概念 C中的多态性是面向对象编程的一个重要特征&#xff0c;它允许我们通过一个基类的指针或引用来操作不同派生类的对象。多态性增强了代码的灵活性和可扩展性。主要分为两种类型&#xff1a;编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&am…...

PyODBC: Python 与数据库连接的桥梁

PyODBC: Python 与数据库连接的桥梁 介绍 在现代的开发环境中&#xff0c;数据是核心要素之一。几乎所有的应用程序都需要与数据库进行交互。在 Python 中&#xff0c;pyodbc 是一个非常常用的库&#xff0c;它提供了一种简便的方法&#xff0c;通过 ODBC&#xff08;开放数据…...

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…...

PHP语法学习(第七天)-循环语句,魔术常量

老套路了&#xff0c;朋友们&#xff0c;先回忆昨天讲的内容PHP语法学习(第六天)主要讲了PHP中的if…else语句、关联数组以及数组排序。 想要学习更多PHP语法相关内容点击“PHP专栏&#xff01;” 下列代码都是在PHP在线测试运行环境中得到的&#xff01;&#xff01; 还记得电…...

数据库授权讲解一下

这条 SQL 命令是 MySQL 数据库中用于权限管理的 GRANT 语句。它用于授予用户特定的权限。下面是命令的详细解释&#xff1a; GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY Zz&#xff01;12345678 WITH GRANT OPTION;GRANT&#xff1a; 这是一个关键字&#xff0c;用于…...

组件开发的环境准备: nodejs安装,npm镜像源的修改,pnpm包管理器的安装(全局安装),基于pnpm创建脚手架项目

Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff08;本质是Chrome引擎的封装&#xff09;,允许开发者使用 JavaScript 来编写服务器端代码 npm(Node Package Manager)是 Node.js 包管理器, 用来安装各种库、框架和工具 【Node.js官网】 https://nodejs.org 【n…...

学生成绩统计系统

实验内容 问题描述: 输入n个学生的考试成绩&#xff0c;每个学生信息由姓名与分数组成;试设计一种算法: (1)按分数高低次序&#xff0c;打印出每个学生的名次&#xff0c;分数相同的为同一名次; (2)按名次输出每个学生的姓名与分数。 基本要求: (1)学生的考试成绩必须通过…...

【Spring项目】图书管理系统

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;项目实现准备 1&#xff1a;需求 &#xff08;1&#xff09;登录 2&#xff1a;准备…...

Vivado ILA数据导出MATLAB分析

目录 ILA数据导出 分析方式一 分析方式二 有时候在系统调试时&#xff0c;数据在VIVADO窗口获取的信息有限&#xff0c;可结合MATLAB对已捕获的数据进行分析处理 ILA数据导出 选择信号&#xff0c;单击右键后&#xff0c;会有export ILA DATA选项&#xff0c;将其保存成CS…...

【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 075 &#xff0c;文末自助获取源码 \color{red}{T075&#xff0c;文末自助获取源码} T075&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

【机器学习】——windows下安装anaconda并在vscode上进行配置

一、安装anaconda 1.进入清华的镜像网站&#xff0c;下载自己电脑对应的anaconda版本。网站&#xff1a;https://repo.anaconda.com/archive/ 这里我下载的版本是anaconda3-2024.10-1-Windows-x86-64 2.下载完毕后开始安装anaconda 3.配置anaconda环境变量 在设置中找到编…...

【H2O2|全栈】Node.js与MySQL连接

目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接&#xff0c;并将该过程进行函数封装。 与基础部分的语法相比&#xff0c;ES6的语法进行了一些更加严谨的约束和优化&#…...

汽配行业数字化解决方案(一)

汽配行业数字化解决方案&#xff0c;是通过整合云计算、大数据、人工智能、物联网等先进技术&#xff0c;构建一个全面、高效、智能的数字化生态系统&#xff0c;以实现汽配供应链的全程可视化与智能化管理。该解决方案涵盖了从供应商管理、库存优化、订单处理、物流跟踪到客户…...

前端路径“@/“的使用和配置

环境&#xff1a;vitets 需要安装types/node npm install types/node --save-dev在tsconfig.json中添加 如果有tsconfig.app.json和tsconfig.node.json文件&#xff0c;则在app.json中添加 "compilerOptions": {"baseUrl":".","paths&q…...

动态规划子序列问题系列一>最长递增子序列

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int lengthOfLIS(int[] nums) {int n nums.length;int[] dp new int[n];int ret 1;//最坏情况为1//初始化for(int i 0; i < n; i) dp[i] 1;for(int i 1; i < n; i){for(int j 0; j < i-1; j)if(…...

链表头文件大更新!!!

引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能&#xff0c;让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件&#xff0c;定义了一个模板类 LinkedList&#xff…...

力扣3381.长度可被K整除的子数组的最大元素和

力扣3381.长度可被K整除的子数组的最大元素和 题目 题目解析及思路 题目要求返回一段长度为K的倍数的最大子数组和 同余前缀和 代码 class Solution { public:long long maxSubarraySum(vector<int>& nums, int k) {int n nums.size();vector<long long>…...

http.ServeMux多路复用器的设置

package mainimport ("fmt""net/http" )func first(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-first") }func second(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-second") }func ma…...

优化器与优化方法:在现代科学与工程中的应用

目录 ​编辑 优化器&#xff1a;机器学习中的参数调整 1. 梯度下降系列 2. 动量法&#xff08;Momentum&#xff09; 3. Adagrad 4. RMSprop 5. Adam 优化方法&#xff1a;寻找系统最优解 线性规划 非线性规划 凸优化 非凸优化 结论 在当今的科学和工程领域&#…...

笔记本外接显示屏没声音

1、笔记本正常有声音&#xff0c;但是外接显示屏后没有声音了怎么回事呢&#xff1f;原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出&#xff0c;但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法&#xff1a;打开笔记本设置&#xff0c;选择声…...

vue框架

Vue.js是一种用于构建用户界面的JavaScript框架。它是一个轻量级框架&#xff0c;被设计为逐渐采用的渐进式框架&#xff0c;可以与现有项目集成&#xff0c;也可以作为一个完整的单页应用程序框架使用。 Vue.js具有以下特点&#xff1a; 简单易学&#xff1a;Vue.js的API简单…...

Vue指令(一)--v-html、v-show、v-if、v-else、v-else-if、v-on、v-bind、v-for、v-model

目录 &#xff08;一&#xff09;初识指令和内容渲染指令v-html 1.v-html 案例&#xff1a; 官网的API文档 &#xff08;二&#xff09;条件渲染指令v-show和v-if 1. v-show 2. v-if &#xff08;三&#xff09;条件渲染指令v-else和v-else-if 案例 &#xff08;四…...

ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书

文章目录 1. 说明2. 启个 mysql3. 设置慢查询4. filebeat 设置5. 触发慢查询6. MySQL 告警至飞书 1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 mysql docker-compose.yml 中 mysql&#xff1a; mysql:# restart: alwaysimage: mysql:8.0.27# ports:# - "3306:3306&q…...

QT通过在线安装器安装【详细】

在线安装器地址&#xff1a; 官方在线安装器&#xff1a;Index of /official_releases/online_installers (qt.io) 通过命令行启动安装页面 直接双击qt安装程序&#xff0c;在线安装会非常慢&#xff0c;甚至安装失败&#xff0c;所以通过命令行页面启动安装页面。点击wind…...

34.1 uber开源的m3db简介

本节重点介绍 : m3db自己的定位m3db自己的架构m3db自己的组件 两句话简介 M3最初是在优步开发的&#xff0c;目的是提供对优步业务运营&#xff0c;微服务和基础架构的可视性由于M3具有轻松进行水平扩展的能力&#xff0c;因此它为所有监视用例提供了一个集中式存储解决方案…...

MATLAB 最小二乘点云拟合球 (89)

MATLAB 最小二乘点云拟合球 (89) 一、算法介绍二、算法实现1.代码2.结果这是缘,亦是最美的相见 一、算法介绍 球面拟合算法是一种通过数学方法将一组三维点(通常在三维空间中分布)拟合到一个理想的球形表面上。这个过程通常涉及使用最小二乘法来最小化实际数据点与拟合的…...

【Altium Designer 】AD如何使用嘉立创元器件的3D封装

1.下载3D封装 以STM32F407VGT6为例&#xff0c;进入嘉立创商城网站&#xff0c;找到需要的元器件封装 复制编号&#xff0c;打开嘉立创EDA&#xff0c;编译器选择专业版&#xff0c;新建工程&#xff0c;点击PCB1 复制编号在搜索框中&#xff0c;点击搜索&#xff0c;然后放置…...

G15沈海高速茶白高架自动化监测

1. 项目简介 G15 沈海高速公路北起辽宁省沈阳市苏家屯区金宝台枢纽&#xff0c;与沈阳市绕城高速公路&#xff08;国家高速 G1501&#xff09;相接&#xff0c;南至海南省海口市秀英区粤海枢纽&#xff0c;与海南地区环线高速公路&#xff08;国家高速 G98&#xff09;相交&am…...

网站从渗透到mssql提权全过程

2|0渗透全过程 1.信息收集-端口探测 1&#xff09;Nmap端口探测&#xff1a;namp -sS -p 1-65535 172.16.12.103 可以看到端口开放情况 2.判断系统情况 根据端口情况初步判定为IISmssql.net系统&#xff0c;访问web站点URL应该为&#xff1a;http:172.16.12.103:27689 访问…...

Qt多线程与QTimer详解

引用 Qt多线程中使用QTimer&#xff08;常见问题汇总&#xff09; [多线程]多线程使用QTimer Qt::ConnectionType&#xff1a;Qt不同类型connect的详细区别说明与应用 Qt的4种多线程实现方式 一文搞定之Qt多线程(QThread、moveToThread) QTimer The QTimer class provides repe…...