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

【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类

默认情形下,成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行,需要在成员函数的声明前加上关键字virtual:

//LibMat声明表示,其析构函数和print()函数皆为虚函数
class LibMat{
public:LibMat(){cout<<"LibMat::LibMat() default constructor!\m";}virtual ~LibMat(){cout<<"LibMat::~LibMat() destructor!\n";}virtual void print()const{cout<<"LibMat::print()--I am a LibMat object!\n";}
};

虚函数的作用:
用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,会调用真正指向对象的成员函数,而不是基类中定义的成员函数;若不是虚函数,则只会调用基类中定义的那个函数

void print(const LibMat &mat)
{cout<<"in global print():about to print mat.print()\n";//下一行会依据mat实际指向的对象//解析该执行哪一个print()成员函数mat.print();
}
//main函数中重复调用print()
//并依次将三个对象作为参数传递给它
//每次执行
int main()
{cout<<"\n"<<"Creating a LibMat object to print()\n";LibMat libmat;print(libmat);cout<<"\n"<<"Creating a Book object to print()\n";Book b("The Castle","Franz Kafka");print(b);cout<<"\n"<<"Creating an AudiBook = object to print()\n";AudioBook ab("Man without Qualities","Robert Musil","Kenneth Meyer");print(ab);
}
class Book : public LibMat {  //定义派生类Book,继承自LibMat
public:Book( const string &title, const string &author ): _title( title ), _author( author ){cout << "Book::Book( " << _title<< ", " << _author << " )  constructor\n";}~Book(){cout << "Book::~Book() destructor!\n";}virtual void print() const {cout << "Book::print() -- I am a Book object!\n"<< "My title is: " << _title << '\n'<< "My author is: " << _author << endl;}const string& title() const { return _title; }const string& author() const { return _author; }protected:string _title;string _author;
};

被声明为protected的所有成员都可以被派生类直接访问;除了派生类之外,都不得直接访问protected成员。

class AudioBook : public Book {
public:AudioBook( const string &title,const string &author, const string &narrator ): Book( title, author ), _narrator( narrator ){cout << "AudioBook::AudioBook( " << _title<< ", " << _author<< ", " << _narrator<< " )  constructor\n";}~AudioBook(){cout << "AudioBook::~AudioBook() destructor!\n";}virtual void print() const {cout << "AudioBook::print() -- I am a AudioBook object!\n"<< "My title is: " << _title << '\n'<< "My author is: " << _author << '\n'<< "My narrator is: " << _narrator << endl;}const string& narrator() const { return _narrator; }protected:string _narrator;
};

派生类的构造函数作用后顺序:
基类的构造函数、派生类的析构函数、基类的析构函数。

总结

示例中分别实现了三种类:LibMatBookAudioBook

  1. 三者的成员函数有重合之处,其中print()这一成员函数的具体实现各有不同,使用virtual关键字,以调用真正指向的对象的成员函数(虚拟调用);
  2. 使用:号和public实现派生类继承的标记,不必刻意区分“继承而来的成员”和“自身定义的成员",在其使用上无特别的不同之处;
  3. 被声明为protected的所有成员都可以被派生类直接访问;
    除了派生类之外,都不得直接访问protected成员。
  4. 当程序定义出一个派生对象,基类和派生类的构造函数都会被执行;
    当派生对象被销毁时,基类和派生类的析构函数也都会被执行,且执行顺序颠倒

相关文章:

【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类

默认情形下&#xff0c;成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行&#xff0c;需要在成员函数的声明前加上关键字virtual&#xff1a; //LibMat声明表示&#xff0c;其析构函数和print()函数皆为虚函数 class LibMat{ public:LibMat(){c…...

【古谷彻】算法模板(更新ing···)

目录 一、数学 1、逆元 (一)费马小定理/欧拉定理(快速幂) 2、组合数 (1)求组合数C(n,m) 方法一:阶乘+逆元+快速幂求组合数 方法二:记忆化搜索 方法三:递推公式 (2)组合数求概率 3、高精度sqrt (1)二分法 (2)递加递减 4、快速幂 5、欧拉函数 方法一:…...

Day-06 基于 Docker 安装 Nginx 镜像

1.去官方公有仓库查询nginx镜像 docker search nginx 2.拉取该镜像 docker pull nginx 3. 启动镜像&#xff0c;使用nginx服务&#xff0c;代理本机8080端口(测试是不是好使) docker run -d -p 8080:80 --name nginx-8080 nginx docker ps curl 127.0.0.1:8080...

k8s集群-7 service

工作负载的应用是如何暴露出去的 解决访问问题 Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service&#xff0c;应用可以方便地实现服务发现和负载均衡。 service默认只支持4层负载均衡能力&#xff0c;没有7层功能。(可以通过Ingress实现) service的类型: C…...

JS进阶-防抖和节流

防抖&#xff08;debounce&#xff09; 单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次。 例子&#xff1a;王者荣耀回城&#xff0c;只要被打断就需要重新来 使用场景&#xff1a; 1&#xff09;搜索框搜索输入。只需用户最后一次输入完&#xff0c;再发送…...

踩坑日记 uniapp 底部 tabber遮挡住购物车结算

tabbar 被购物车结算遮挡 在小程序上tabbar没有将固定栏遮挡&#xff0c;如果直接调高&#xff0c;浏览器H5页面是对了&#xff0c;但在小程序上面离底部的定位就太高了 原代码 // 底部结算样式.shop-foot {border-top: 2rpx solid #F7F7F7;background-color: #FFF;position: …...

【MySQL】表的约束(一)

文章目录 为什么要有约束一. 空属性二. 默认值三. 列描述四. zerofill结束语 为什么要有约束 数据库是用来存放数据的&#xff0c;所以其需要保证数据的完整性和可靠性 数据类型也算是一种约束&#xff0c;比如&#xff0c;整型的数据无法插入字符型。 通过约束&#xff0c;让…...

Excel宏管理库存清单

1. 开启宏: - 打开 Excel - 选择 “文件” > “选项” > “自定义功能区” > “开发工具” &#xff0c;将其添加到功能区。 - 返回Excel界面&#xff0c;点击 “开发工具” 选项卡。 2.准备你的库存清单&#xff1a; - 在一个新的工作表中创建你的库存清单。…...

C语言练习百题之排序算法

题目:C语言实现排序算法 冒泡排序 思路&#xff1a; 依次比较相邻的元素&#xff0c;如果顺序不对则交换&#xff0c;直到整个数组有序。 实现代码&#xff1a; #include <stdio.h>void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) {for (int j…...

通过ElementUi在Vue搭建的项目中实现CRUD

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…...

【CSS如何进行圣杯布局】

圣杯布局是一种经典的三栏布局&#xff0c;其中中间的主栏宽度自适应&#xff0c;两侧的边栏宽度固定。实现圣杯布局可以使用CSS中的浮动、定位、负边距等属性。 以下是一种实现圣杯布局的方法&#xff1a; HTML结构&#xff1a; <div class"container"><…...

flex 实现的圣杯布局

关键点 通过 margin-left 与 left 属性将左右两列放置到准确的位置; 父元素需要设置 padding; margin-left 取值为百分比时,是以其父元素的宽度为基准的;和双飞翼不同的地方 圣杯布局的的左中右三列容器没有多余子容器存在,通过控制父元素的 padding 空出左右两列的宽度。…...

数字人直播软件排名推荐,铭顺科技数字人品牌抢占“日不落”流量新技能

在今年的618中&#xff0c;相信大家能明显感受到&#xff0c;现如今已经有越来越多的品牌商都在使用AI营销工具&#xff0c;如AI营销工具、AI电话、AI虚拟主播。据京东战报显示&#xff0c;在今年的618中&#xff0c;使用AI数字人直播比去年双11增幅近5倍。 7*24小时不间断直播…...

【AI视野·今日Robot 机器人论文速览 第四十五期】Mon, 2 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 2 Oct 2023 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;PONG, Probabilistic Object Normals for Grasping 用于抓取的概率目标归一化&#xff0c;根据目标表面法向量获取的不确定…...

【计算机网络】网络编程接口 Socket API 解读(9)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…...

用户端App自动化测试

一、capability 进阶用法 1、 deviceName 只是设备的名字&#xff0c;别名随便起不能锁定唯一一个设备 2、 uid 多设备选择的时候&#xff0c;要指定 uid默认读取设备列表的第一个设备设备列表获取 adb devices 3、 newCommandTimeout appium 程序应等待来自客户端的新命…...

[洛谷]P2697 宝石串(经典好题!)

思路&#xff1a; 对于一个类似的东西进行前缀和&#xff1a; G R G G R G G&#xff1a;1 1 2 3 3 4 R&#xff1a;0 1 1 1 2 2 差&#xff1a;1 0 1 2 1 2 所得关于差的数列&#xff0c;同样的数最左最右的位置差为一个答案&#xff0c;选取最大的答案即为解&#xff0…...

毫米波汽车雷达测试应用指南

汽车毫米波雷达测试背景 车载毫米波雷达通过天线向外发射毫米波&#xff0c;接收目标反射信号&#xff0c;经后方处理后快速准确地获取汽车车身周围的物理环境信息&#xff08;如汽车与其他物体之间的相对距离、相对速度、角度、运动方向等&#xff09;&#xff0c;然后根据所…...

抖音账号矩阵系统开发源码----技术研发

一、技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 抖音账号矩阵系统开发源码 部分源码分享&#xff1a; ic function indexAction() { //面包屑 $breadc…...

C++ 33.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是直接用汇编语言编写的随着UNIX系统的发展&#xff0c;汇编语言的开发效率成为瓶颈&#xff0c;所以需要一个新的语言替代汇编语言1971年通过对B语言改良&#xff0c;使其能直接产生机器代码&#xff0c;C语言诞生UNIX使用C语言重写&#xff0c…...

当LLM学会“思考”算法逻辑:拆解EoH如何用“思想+代码”协同进化,碾压传统自动设计

当LLM成为算法设计师&#xff1a;揭秘EoH如何用“思维代码”双螺旋进化重塑自动算法设计 想象一下&#xff0c;你正在指挥一支由建筑师和施工队组成的特殊团队。建筑师负责绘制蓝图&#xff0c;施工队负责将蓝图变为现实。但与传统团队不同&#xff0c;你的建筑师能根据施工反…...

从51到STM32:手把手教你用STM32CubeMX和PWM驱动智能小车电机(附代码避坑)

从51到STM32&#xff1a;智能小车电机控制的进阶实战指南 十年前用51单片机做智能小车时&#xff0c;PWM配置需要手动计算定时器重装载值&#xff0c;而今天在STM32CubeMX里勾选几下就能生成精准的PWM信号——这就像从手动挡升级到了自动驾驶。作为过来人&#xff0c;我完整记…...

革新性暗黑破坏神2存档管理开源工具:d2s-editor全功能解析

革新性暗黑破坏神2存档管理开源工具&#xff1a;d2s-editor全功能解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2存档修改门槛高&#xff1f;复杂二进制格式难以操作&#xff1f;d2s-editor作为免费开源的Web端…...

少样本学习实战指南:从数据增强到多模态融合的5个关键技巧

少样本学习实战指南&#xff1a;从数据增强到多模态融合的5个关键技巧 在工业质检和医疗影像等实际场景中&#xff0c;数据稀缺问题长期困扰着机器学习工程师。传统深度学习模型需要海量标注数据&#xff0c;而现实情况往往是每个类别仅有几个样本可用。这种少样本学习&#xf…...

新一代OpenWRT主题:Neobird革新路由器管理体验

新一代OpenWRT主题&#xff1a;Neobird革新路由器管理体验 【免费下载链接】luci-theme-neobird 一个专门针对移动端优化的OpenWRT主题&#xff0c;基于luci-theme-material&#xff0c;全新的登录界面&#xff0c;沉浸式Webapp体验。 项目地址: https://gitcode.com/gh_mirr…...

03-CAPL 常用函数大全

专栏&#xff1a;《CAPL 脚本编写实战指南》第 3 篇 作者&#xff1a;一线汽车电子测试工程师 适合人群&#xff1a;已掌握 CAPL 基础的测试人员、想系统学习 CAPL 函数的工程师开篇&#xff1a;为什么要学 CAPL 函数&#xff1f; 这是我刚学 CAPL 时的真实经历。 当时的情况&a…...

CosyVoice3在CSDN星图一键部署:开箱即用,无需复杂配置

CosyVoice3在CSDN星图一键部署&#xff1a;开箱即用&#xff0c;无需复杂配置 1. 引言&#xff1a;语音克隆技术的新选择 你是否曾经想过&#xff0c;只需几秒钟的录音就能让AI完美复刻你的声音&#xff1f;或者为你的视频内容添加多种方言配音&#xff1f;CosyVoice3作为阿里…...

卡证检测矫正模型效果展示:高清四角点定位+正视角矫正图实拍

卡证检测矫正模型效果展示&#xff1a;高清四角点定位正视角矫正图实拍 你有没有遇到过这样的烦恼&#xff1f;需要上传身份证、驾照或者护照照片时&#xff0c;手机随手一拍&#xff0c;结果照片歪歪扭扭&#xff0c;背景杂乱&#xff0c;关键信息还被手指挡住了。这时候要么…...

终极Windows XP错误对话框组件:怀旧系统提示的优雅实现指南

终极Windows XP错误对话框组件&#xff1a;怀旧系统提示的优雅实现指南 【免费下载链接】winXP &#x1f3c1; Web based Windows XP desktop recreation. 项目地址: https://gitcode.com/gh_mirrors/wi/winXP 你是否怀念Windows XP那个经典的错误提示对话框&#xff1…...

EfficientViT-GazeSAM完整部署指南:在RTX 4070上实现实时注视分割

EfficientViT-GazeSAM完整部署指南&#xff1a;在RTX 4070上实现实时注视分割 【免费下载链接】efficientvit EfficientViT is a new family of vision models for efficient high-resolution vision. 项目地址: https://gitcode.com/gh_mirrors/ef/efficientvit Effici…...