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

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

2.2、不明确的基类

        另外一种引发不明确的方式是从同样的类中继承了两次。如果父类自身有一个共同的父类时会发生。例如,可能Bird与Dog都继承自Animal类,图示如下:

        这种层次结构的类类型在c++中是允许的,但名字不明确仍会产生。例如,如果Animal类有一个公共的成员函数叫做sleep(),该成员函数在DogBird对象上不能被调用,因为编译器不知道到底是去调用Dog还是Bird继承的版本。

        使用这些“钻石形状”的类层次结构的最好的方式是使最顶部的类是一个所有成员函数声明为干净的virtual的抽象类。因为该类只声明成员函数而不提供定义,没有基类的成员函数可调用,因些在这个层次上就没有不明确。

        下面的例子实现了一个钻石高度类层次结构,Animal抽象类有一个干净的virtual eat()成员函数,必须在每一个继承类中进行定义。DogBird类仍然需要显式指出哪个父类的eat()成员函数被使用,但是Dog与Bird产生的任何不明确都有同样的成员函数,而不是因为它们都继承自同样的类。

class Animal
{
public:
	virtual void eat() = 0;
};

class Dog : public Animal
{
public:
	virtual void bark() { println("Woof!"); }
	void eat() override { println("The dog ate."); }
};

class Bird : public Animal
{
public:
	virtual void chirp() { println("Chirp!"); }
	void eat() override { println("The bird ate."); }
};

class DogBird : public Dog, public Bird
{
public:
	using Dog::eat;
};

        处理这种钻石开关层次结构顶部类的更好的方式是virtual基类,本章后面会进行解释。

2.3、多重继承的使用

        在这一点上,你可能会想为什么程序员想要在代码中处理多重继承。对于多重继承最直接的使用场景就是定义一个类既是某物,也是另外之物。我们在前面的章节中说过,任何真实世界中发现的这种模式都不会好好地转化为代码。

        多重继承最鼓舞人心且最简单的使用场景就是混合类的实现。这个我们前面简单提到过,以后还会详细讨论。

        另外一个原因就是人们有时使用多重继承来模型化一个基于组件的类。前面我们给出过飞机模拟器的例子。Airplane类有一个引擎,机身,控制器,以及其他部件。Airplane类的典型实现会是让这些部件成为单独的数据成员,可以使用多重继承。飞机类会继承引擎,机身,和控制器,有效地获得所有这些部件的行为与属性。推荐远离这种类型的代码,因为它使用继承把一个清晰的包含关系搞混淆,其应该是用于继承关系的。推荐的解决方案是用一个Airplane类,包含了Engine,Fuselage,与Controls类型的数据成员。


http://www.kler.cn/news/364199.html

相关文章:

  • 【java面向对象编程】第一弹----类与对象的理解及类和对象的内存分配机制
  • Android 自定义 Dialog 实现列表 单选,多选,搜索
  • [蓝桥杯 2024 省 C] 回文数组
  • NLP--一起学习Word Vector【实践】
  • STMicroelectronics 意法半导体芯片选型表
  • Spring Boot集成:高效论坛网站的构建
  • 技术成神之路:二十三种设计模式(导航页)
  • linux中time_wait过多问题怎么解决
  • 部署前后端分离若依项目--CentOS7Docker版
  • Qt Splash 与登录界面窗口
  • 【Bug】RuntimeError: Engine loop has died
  • 网站安全问题都有哪些,分别详细说明
  • Flutter通过showDialog实现下拉筛选菜单效果
  • Konva 组,层级
  • Altera宣布价格上调,最高上调20%
  • 微知-Linux内核自带的模块被压缩为ko.xz后如何恢复成不压缩版本?(xz -d xxx.ko.xz)
  • React-Route新版本(v6或以上)用法示例
  • centos7源码编译qt5.15.15
  • 实战二:网络爬虫
  • vue npm run ...时 报错-系统找不到指定的路径
  • 【计网】深入理解网络通信:端口号、Socket编程及编程接口
  • XJ01、消费金融|互联网消费金融行业基本概述
  • 【人工智能-初级】第7章 聚类算法K-Means:理论讲解与代码示例
  • 使用STM32实现对电机的PID控制
  • 爬虫之数据解析2
  • 京准电钟解读:NTP网络对时服务器助力厂区改造方案