继承(二)

隐藏/重定义:子类和父类有同名的成员,子类成员隐藏了父类的成员。

重载:同一个作用域,重载了参数。

(在实际中最好不要定义同名函数)

子类对象不能初始化父类对象,用父类成员初始化子类成员。

析构函数会自动调用。

显示调用父类析构,无法保证先子后父,所以子类析构函数完成舅自定义调用父类析构,这样就保证了先子后父。

友元关系不能继承。

子类继承父类的静态成员,继承的是使用权(地址一样)

面经:

1. 什么是菱形继承?菱形继承的问题是什么?
答:菱形继承(Diamond Inheritance)是指在多继承的编程语言中出现的一种特定的继承模式。这种模式涉及到四个类:一个基类(A),两个派生类(B 和 C),以及一个从这两个派生类继承的顶层类(D)。
问题:数据冗余、二义性。
二义性:当两个派生类 B 和 C 都覆盖或使用了来自基类 A 的某个成员时,顶层类 D 将不知道应该使用哪一个版本,因为每个派生类都有自己的 A 类的副本。例如,如果 A 有一个方法 func(), B 和 C 都继承并可能修改了这个方法,那么 D 中调用 func() 时就会产生疑问:它应该调用哪个版本?
二义性解决办法: C++:使用虚继承(virtual inheritance)。虚继承确保了即使有多个派生路径,也只有一个基类实例存在。这样可以避免二义性问题。
2. 什么是菱形虚拟继承?如何解决数据冗余和二义性的
答:菱形虚拟继承是C++中解决菱形继承问题的一种机制。菱形继承是指一个类同时从两个类继承,而这两个类又共同从另一个类继承的情况。这种继承模式可能会导致数据冗余和二义性问题。

如何实现菱形虚拟继承

为了使用菱形虚拟继承,你需要在中间层类(即图中的B和C)中将对基类A的继承声明为虚拟继承。下面是一个例子:

class A {
public:int data;
};class B : virtual public A { /* ... */ };class C : virtual public A { /* ... */ };class D : public B, public C {
public:void setData(int value) { data = value; } // 此处的 data 不会产生二义性
};

在这个例子中,BC 类都使用 virtual public A 来声明对 A 类的继承。这确保了尽管 D 类从 BC 继承,但是 A 类的数据成员 data 只会被继承一次。

  • 使用virtual关键字:在中间层类(如B和C)中使用virtual关键字修饰继承。
  • 仅在必要时使用:虚拟继承会增加类层次结构的复杂度,并且可能会影响性能(因为它需要额外的间接性来支持虚拟基类的唯一实例),因此只在需要时使用。
  • 虚拟继承的影响:虚拟继承不仅解决了数据冗余和二义性问题,还会影响构造函数和析构函数的调用顺序,因此需要特别注意这一点。
3. 继承和组合的区别?什么时候用继承?什么时候用组合?
答:
很多人说 C++ 语法复杂,其实多继承就是一个体现。有了多继承 ,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。
多继承可以认为是 C++ 的缺陷之一,很多后来的 OO 语言都没有多继承,如 Java
继承和组合
public 继承是一种 is-a 的关系。也就是说每个派生类对象都是一个基类对象。
组合是一种 has-a 的关系。假设 B 组合了 A ,每个 B 对象中都有一个 A 对象。
优先使用对象组合,而不是类继承
继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse) 。术语 白箱 是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。
对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse) ,因为对象的内部细节是不可见的。对象只以 黑箱 的形式出现。
组合类之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于你保持每个类被封装。
实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合。

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

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

相关文章

开关电源之结构分析

如有技术问题及技术需求请加作者微信! 开关电源之结构分析 1、开关电源的结构 常用开关电源,主要是为电子设备提供直流电源供电。电子设备所需要的直流电压,范围一般都在几伏到十几伏,而交流市电电源供给的电压为220V(110V),频率为50Hz(60Hz)。开关电源的作用就是把一…

【Unity】线性代数基础:矩阵、矩阵乘法、转置矩阵、逆矩阵、正交矩阵等

文章目录 矩阵(Matrix)矩阵能干啥?矩阵基本运算矩阵加减法矩阵和标量的乘法矩阵和矩阵的乘法矩阵的转置矩阵相等 特殊的矩阵方块矩阵对称矩阵对角元素(Diagonal Elements)对角矩阵(Diagonal Matrix&#xf…

C语言-函数

一、函数的概念 其实在C语⾔也引⼊函数(function)的概念,有些翻译为:⼦程序,⼦程序这种翻译更加准确⼀些。C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。C语⾔的程序其…

hs_err_pid.log分析

hs_err_pid.log 文件是 Java 虚拟机(JVM)在遇到致命错误(如崩溃或内部错误)时生成的错误日志文件。这个文件包含了关于崩溃的详细信息,可以帮助开发者或系统管理员诊断和解决问题。 hs_err_pid.log文件位置和命名 文…

基于springboot3实现单点登录(二):认证服务端搭建

前言 上文我们介绍了oauth2.0的相关理论和流程,本文我们继续实现。 Oauth2协议中有个很重要的概念,叫做”端点“, 以下整理了一些常用的端点及其参考访问路径及使用场景的信息,供参考。 这些端点在oauth2.0协议的整个生命周期…

python自动化笔记:操作mysql数据库

操作mysql数据库常见方法 1、第三方库:pymysql1.1、安装pymysql1.2、连接数据库1.3、连接指定数据库1.4 创建数据库、创建表1.5、表中插入数据1.6、批量插入数据1.7、获取查询结果数据1.8、防sql注入,sql语句中一般用占位符传值 2、标准库 :m…

【《Kafka 入门指南:从零基础到精通》】

前言: 💞💞大家好,我是书生♡,本阶段和大家一起分享和探索KAFKA,本篇文章主要讲述了:消息队列的基础知识,KAFKA消息队列等等。欢迎大家一起探索讨论!!&#x…

rocketMQ5.0事务消息实战

事务消息逻辑 docker部署容器,并且创建消息 dd首先我们来docker 部署rocketMQ与rocketMQDashBoard docker ps查看rocketMQ 容器名称 docker ps 进入容器内部 docker exec -it rmqnamesrv /bin/bash 创建事务消息 MeessageType: TRANSACTION sh mqadmin upda…

Linux驱动.之I2C,iic驱动层(二)

一、 Linux下IIC驱动架构 本篇只分析,一个整体框架。 1、首先说说,单片机,的i2c硬件接口图,一个i2c接口,通过sda和scl总线,外接了多个设备device,通过单片机,来控制i2c的信号发生&…

解锁数据“智能”背后的秘密

在这个被数据洪流包围的时代,每一秒都有无数的信息在生成、传递、分析。但你是否曾好奇,这些数据是如何从简单的数字、文字转化为推动社会进步、改变生活方式的“智能”力量的?今天,就让我们一起揭开数据“智能”背后的神秘面纱&a…

C语言文达学院班级管理系统-计算机毕业设计源码03499

摘 要 本文阐述了一个C语言文达学院班级管理系统的设计与实现过程。该系统充分利用ASP.NET的轻量级、灵活性和可扩展性,旨在为文达学院提供高效、便捷的班级管理系统。通过详细的需求分析、技术选型、系统设计、开发实现、测试与调试以及部署与上线等步骤&#xff0…

通过python管理mysql

打开防火墙端口: 使用 firewall-cmd 命令在防火墙的 public 区域中永久添加 TCP 端口 7500(FRP 控制台面板端口)、7000(FRP 服务端端口)以及端口范围 6000-6100(一组客户端端口)。这些端口是 FR…

Unity补完计划 之 动态控制TileMap

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.TileMap &TileBase Unity - Scripting API: Tilemap ,看手册内容太多了故介绍几个常用的公共方法 首…

【凌鸥学园】电机电控课程学习,挑战自我!

电控达人集结号!凌鸥学园精心打造的电机电控课程,现面向全体爱好者及专业人士免费开放! 课程内容从基础原理到高级应用,全方位助力你快速掌握电机电控精髓,实现技能飞跃! 挑战成功,双重奖励等…

12. 矩阵中的路径

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9812.%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E8%B7%AF%E5%BE%84/README.md 面试题 12. 矩阵中的路径 题目描述 给定一个 m x n 二维字符网格 board…

Java的反射原理

反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现,它主要用于以下目的: 在运行时分析类的能力:通过反射,可以在运行时检查类的结构,比如它的方法、构造…

【RAG检索增强生成】Ollama+AnythingLLM本地搭建RAG大模型私有知识库

目录 前言一、Ollama:革新性的本地LLM服务工具1.核心优势2.技术亮点 二、AnythingLLM 概览1.核心特性2.技术生态支持 三、搭建本地智能知识库1. Ollama的安装启航2. AnythingLLM的安装对接3. AnythingLLM的配置精调4. 工作区与文档管理5. 聊天与检索的智能交互 四、…

计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

封装el-table 基于element封装可配置JSON表格组件

基于element封装可配置JSON表格组件 话不多说直接贴代码&#xff0c;复制运行即可查看效果 子组件全部代码 <template><div class"custom-table"><el-table:data"tableData"borderstyle"width: 100%"size"mini"max-h…

负载均衡之HAProxy超全内容!!!

一、负载均衡 1.1 负载均衡概念 负载均衡&#xff08;Load Balance&#xff0c;简称 LB&#xff09;是高并发、高可用系统必不可少的关键组件&#xff0c;目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 1.2 软件负载均衡 软件…