C++学习笔记----9、发现继承的技巧(五)---- 多重继承(1)

        我们前面提到过,多重继承常被认为是面向对象编程中复杂且没有必要的部分。这就仁者见仁,智者见智了,留给大家去评判。本节解释c++中的多重继承。

1、多个类继承

        从语法角度来说,定义一个有多个父类的类是很简单的。需要做的就是当声明类名的时候把基类一个个地列出来。

class Baz : public Foo, public Bar { /* Etc. */ };

通过列出多个父类,Baz对象有下列特点:

  • Baz对象支持Foo与Bar的公共成员函数,包含了两者的数据成员。
  • Baz类的成员函数可以访问Foo与Bar的受保护的数据与成员函数。
  • Baz对象可以向上转化为Foo或Bar。
  • 生成新的Baz对象自动调用Foo与Bar的缺省构造函数,以在类定义中列出的类的顺序。
  • 删除Baz对象自动调用Foo与Bar类的析构函数,以类定义中类列出的相反的顺序。

        下面的例子展示了一个类,DogBird,它有两个父类,一个Dog类和一个Bird类,如下图所示:

        事实是dog-bird是一个很搞笑的例子,不应该被看作多重继承自身就很离奇。实话实说,留给大家去评说吧。

class Dog
{
public:virtual void bark() { println("Woof!"); }
};class Bird
{
public:virtual void chirp() { println("Chirp!"); }
};class DogBird : public Dog, public Bird
{
};

        使用带有多重父类的类对象与没有多重父类的对象没有区别。实际上,客户端代码甚至都不需要知道类是否有两个父类。重要的是类支持的属性与行为,DogBird对象支持所有的Dog与Bird的公共成员函数。

	DogBird myConfusedAnimal;myConfusedAnimal.bark();myConfusedAnimal.chirp();

该程序的输出如下:

Woof!
Chirp!

2、名字冲突与不明确的基类

        构造一个多重继承看起来要崩溃的场景还是不难的。下面的例子展示一个必须要考虑的边缘场景。

2.1、名字不明确

        如果Dog类与Bird类两者都有一个成员函数叫做eat()会出现什么情况?因为Dog与Bird真不不相关,其中的一个成员函数的版本不会重载另一个--它们都会在DogBird的继承类中继续存在。

        只要客户端代码永远不会尝试去调用eat()成员函数,那就不是问题。DogBird类在存在两个版本的eat()的情况下也能正确地编译。然而,如果客户端代码尝试调用DogBird上的eat()成员函数,编译器就会给出错误,提示对eat()的调用是不明确的。编译器不知道去调用哪个版本。下面的代码引发了这种不确定性的错误:

class Dog
{
public:virtual void bark() { println("Woof!"); }virtual void eat() { println("The dog ate."); }
};class Bird
{
public:virtual void chirp() { println("Chirp!"); }virtual void eat() { println("The bird ate."); }
};class DogBird : public Dog, public Bird
{
};int main()
{DogBird myConfusedAnimal;myConfusedAnimal.eat();           // Error! Ambiguous call to member function eat()
}

        如果注释掉main()中的调用eat()的最后一行,代码编译成功。

        这种不明确的的解决方案是要么显式地使用dynamic_cast()向上将对象进行转化,有效地对编译器隐藏不想要的成员函数的版本,要么使用非不明确的语法。例如,下面的代码显示了两种调用Dog版本的eat()的方法:

	dynamic_cast<Dog&>(myConfusedAnimal).eat(); // Calls Dog::eat()myConfusedAnimal.Dog::eat();                // Calls Dog::eat()

        继承类自身的成员函数也要显式地去除同名的不同成员函数的不明确性,通过使用用于访问父成员函数的同样的语法,也就是,::范围解析符。例如,DogBird类可以防止不明确的错误在其它代码中,通过定义自身的eat()成员函数。它会决定调用哪个父版本。

class DogBird : public Dog, public Bird
{
public:void eat() override{Dog::eat();          // Explicitly call Dog's version of eat()}};

        另一个防止不明确的错误的方式是使用using声明来显式地指出在DogBird中继承的是哪个版本的eat()。举例如下:

class DogBird : public Dog, public Bird
{
public:using Dog::eat;       // Explicitly inherit Dog's version of eat()
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DASCTF 2024金秋十月赛RE题wp

目录 RE1&#xff1a;ezRERE2&#xff1a;ezelfRE3&#xff1a;ezAndroid 3题RE&#xff0c;差一点就AK了&#xff0c;可能好久没打比赛了&#xff0c;技能有所下降&#xff0c;还是需要经常摸一摸工具。 RE1&#xff1a;ezRE 执行的时候dump出来&#xff0c;然后静态分析 发…

Java项目-基于springboot框架的游戏分享系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

[ACTF2020] 新生赛]Exec1

目录 0x01命令执行 [ACTF2020 新生赛]Exec1 1、解法1 2、解法2 3、总结 3.1php命令注入函数 3.2java命令注入函数 3.3常见管道符 0x02SQL注入 [极客大挑战 2019]EasySQL1 0x01命令执行 [ACTF2020 新生赛]Exec1 1、解法1 ping本地&#xff0c;有回显&#xff0c;TTL…

红队-安全见闻篇(上)

声明 学习视频来自B站UP主 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.编程与开发 1.后端语言学习 C语⾔&#xff1a;⼀种通⽤的…

Pytest-Bdd-Playwright 系列教程(1):从零开始教你写自动化测试框架「喂饭教程」

Pytest-Bdd-Playwright 系列教程&#xff08;1&#xff09;&#xff1a;从零开始教你写自动化测试框架「喂饭教程」 前言一、项目结构二、安装依赖三、BDD特性文件四、页面对象五、步骤定义六、测试脚本七、Pytest配置八、运行测试 前言 最近收到一些小伙伴在后台的留言&#x…

生成式AI时代的内容安全与系统构建:合合信息文档图像篡改检测创新方案

目录 一、生成式AI时代的内容安全与图像识别1.图像内容安全的重要性2.伪造文档与证件检测的应用场景3.人脸伪造检测技术 二、系统构建加速与文档解析1.TextIn文档解析平台2.TextIn文档解析输出的示例 三、合合信息的行业影响力总结 一、生成式AI时代的内容安全与图像识别 随着…

python-----函数详解(一)

一、概念及作用&#xff1a; 概念&#xff1a;由若干条语句组成语句块&#xff0c;其中包括函数名称、参数列表&#xff0c;它是组织代码的最小单元&#xff0c;完成一定的功能 作用&#xff1a;把一个代码封装成一个函数&#xff0c;一般按功能组织一段代码 目的就是为了重…

autMan奥特曼机器人-安装或更新golang依赖

autMan2.3.4及以上需要更新中间件或安装golang依赖&#xff0c;参照下列步骤&#xff1a; 一、直装版本 ssh下进入autMan文件夹下plugin/scripts下面输入以下指令&#xff1a; go get -u github.com/hdbjlizhe/middleware二、docker版本 从后台进入web终端&#xff0c;依次输入…

Ubuntu 上安装 Redmine 5.1 指南

文章目录 官网安装文档&#xff1a;命令步骤相关介绍GemRubyRailsBundler 安装 Redmine更新系统包列表和软件包&#xff1a;安装必要的依赖&#xff1a;安装 Ruby&#xff1a;安装 bundler下载 Redmine 源代码&#xff1a;安装 MySQL配置 Redmine 的数据库配置文件&#xff1a;…

Node.js:深入探秘 CommonJS 模块化的奥秘

在Node.js出现之前&#xff0c;服务端JavaScript基本上处于一片荒芜的境况&#xff0c;而当时也没有出现ES6的模块化规范。因此&#xff0c;Node.js采用了当时比较先进的一种模块化规范来实现服务端JavaScript的模块化机制&#xff0c;它就是CommonJS&#xff0c;有时也简称为C…

2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日

2024-10-18日 2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&…

论文阅读(二十四):SA-Net: Shuffle Attention for Deep Convolutional Neural Networks

文章目录 Abstract1.Introduction2.Shuffle Attention3.Code 论文&#xff1a;SA-Net&#xff1a;Shuffle Attention for Deep Convolutional Neural Networks(SA-Net&#xff1a;置换注意力机制)   论文链接&#xff1a;SA-Net&#xff1a;Shuffle Attention for Deep Convo…

九州未来亓绚亮相丽台Solution Day 2024,共建AI赋能教育新时代

在数字化浪潮席卷全球的当下&#xff0c;生成式人工智能正迅速渗透至数字世界的每一个角落&#xff0c;而AI技术的物理化应用也正成为新的趋势。10月22日&#xff0c;丽台解决方案日Solution Day 2024&#xff1a;物理AI推动行业数字变革在上海绿地外滩中心顺利举行。 大会聚焦…

报表工具怎么选?山海鲸VS帆软,哪个更适合你?

概述 在国产报表软件市场中&#xff0c;山海鲸报表和帆软这两款工具都占有一席之地&#xff0c;许多企业在选择报表工具时常常在它们之间徘徊。然而&#xff0c;随着企业对数据分析需求的不断增长和复杂化&#xff0c;如何选取一款高效、易用且性价比高的报表工具&#xff0c;…

“摄像机”跟随及攻击抖动实现

学习Unity的摄像机功能&#xff0c;可以帮助我们实现摄像机对人物的跟随移动&#xff0c;还可以使用这个工具自带的插件&#xff0c;摄像机震动&#xff0c;颤动&#xff0c;增强打击感&#xff1b; 首先来安装一下这个插件&#xff0c;window菜单--packageManage--左上角Unit…

vcpkg 从清单文件安装依赖项

vcpkg 有两种运行模式&#xff1a;经典模式和清单模式。清单文件有自己的 vcpkg_installed 目录&#xff0c;可在其中安装依赖项&#xff0c;与所有包都安装在通用 %VCPKG_ROOT%/installed 目录中的经典模式不同。 因此&#xff0c;每个项目都可以有自己的清单和自己的一组依赖…

R语言机器学习算法实战系列(十)自适应提升分类算法 (Adaptive Boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总…

生发产品哪个效果最好?油秃头秋冬季养发搭子

如果你是大额头 或者 M型发际线&#xff0c;无论是天生的 亦或者是后天造成的&#xff0c;养发防脱一定要重视起来&#xff0c;因为防脱育发是需要循序渐进坚持的&#xff0c;今天就给大家分享一下几个特别有效的育发液&#xff0c;选对产品养发那真是稳了~ 1、露卡菲娅防脱育发…

Unity之XR Interaction Toolkit 射线拖拽3DUI

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、想实现的功能二、实现原理1.UI挂在XRGrabInteractable、刚体、BoxCollder2.修改刚体属性3.加BoxCollder 总结 前言 VR项目里正常情况有放置两种3DUI的方式…

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…