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

详解c++菱形继承和多态---下

菱形继承

#include<iostream>using namespace std;
class Animal
{
public:int m_Age;
};
class Sheep : public Animal {};
class Tuo : public Animal {};
class SheepTuo : public Sheep, public Tuo {};
void test()
{SheepTuo st;st.Sheep::m_Age = 18;st.Tuo::m_Age = 20;cout << "st.Sheep::m_Age: " << st.Sheep::m_Age << endl;cout << "st.Tuo::m_Age: " << st.Tuo::m_Age << endl;}
int main()
{test();return 0;
}

菱形继承数据存在二义性问题。

cl /d1 reportSingleClassLayoutSheepTuo test.cpp

虚继承 

class Sheep : virtual public Animal {};
class Tuo : virtual public Animal {};
class SheepTuo : public Sheep, public Tuo {};

多态

动态多态

满足条件

1.有继承关系

2.子类重写父类的虚函数

使用

父类的指针或引用执行子类对象。

重写

函数返回值类型,函数名,参数列表完全一致。

class Animal
{
public:virtual void speak(){cout << "Animal speak()" << endl;}
};
class Cat : public Animal
{
public:void speak(){cout << "Cat speak()" << endl;}
};
void doSpeak(Animal& animal)
{animal.speak();
}
void test()
{Cat cat;doSpeak(cat);
}

Animal类的大小为4,不加virtual大小为1(空类的大小为1)。

子类重写父类的虚函数,子类的虚函数表内部会替换为子类的虚函数地址。

class AbstractCalculator
{
public:virtual int getResult(){return 0;}int m_Num1;int m_Num2;
};
class AddCalculator :public AbstractCalculator
{
public:int getResult(){return m_Num1 + m_Num2;}
};
class SubCalculator :public AbstractCalculator
{
public:int getResult(){return m_Num1 - m_Num2;}
};
void test()
{AbstractCalculator* ac = new AddCalculator;ac->m_Num1 = 1;ac->m_Num2 = 2;cout << ac->getResult() << endl;
}

纯虚函数和抽象类

class AbstractDrinking
{
public:virtual void Boil() = 0;virtual void Brew() = 0;virtual void PourInCup() = 0;virtual void PutSomething() = 0;void makeDrink(){Boil();Brew();PourInCup();PutSomething();}
};
class Coffee :public AbstractDrinking
{virtual void Boil() { cout << "Boil Coffee" << endl; };virtual void Brew() { cout << "Brew Coffee" << endl; };virtual void PourInCup() { cout << "PourInCup Coffee" << endl; };virtual void PutSomething() { cout << "PutSomething Coffee" << endl; };
};
void doWork(AbstractDrinking* ad)
{ad->makeDrink();
}

虚析构和纯虚析构 

父类指针在析构的时候,不会调用子类中的析构函数,导致如果子类有堆区属性会出现内存泄漏。

class Animal
{
public:Animal(){cout << "Animal()" << endl;}virtual ~Animal(){cout << "~Animal()" << endl;}virtual void speak() = 0;
};
class Cat : public Animal
{
public:Cat(string name){cout << "Cat()" << endl;m_Name = new string(name);}void speak(){cout <<*m_Name<< "Cat speak()" << endl;}~Cat(){if (m_Name != nullptr){cout << "~Cat()" << endl;delete m_Name;m_Name = nullptr;}}string* m_Name;
};
void test()
{Animal* animal = new Cat("Tom");animal->speak();delete animal;
}

通过虚析构解决。

纯虚析构

virtual ~Animal() = 0;
Animal::~Animal()
{cout << "virtual ~Animal()" << endl;
}

需要有声明及实现。

总结

虚基表中存偏移量,用于计算X中虚基类XX对象的位置。

虚基表和虚表通常存在常量区。 

相关文章:

详解c++菱形继承和多态---下

菱形继承 #include<iostream>using namespace std; class Animal { public:int m_Age; }; class Sheep : public Animal {}; class Tuo : public Animal {}; class SheepTuo : public Sheep, public Tuo {}; void test() {SheepTuo st;st.Sheep::m_Age 18;st.Tuo::m_Age…...

python学习笔记目录

基于windows下docker安装HDDM-CSDN博客 在python中安装HDDM-CSDN博客&#xff08;这个办法没安装成功&#xff09;...

非结构化数据中台架构设计最佳实践

在数据驱动的时代背景下&#xff0c;非结构化数据已成为企业决策和运营的重要支撑。非结构化数据中台作为企业数据管理和分析的核心平台&#xff0c;其架构设计对于数据的高效利用和业务的快速发展至关重要。本文将探讨非结构化数据中台架构设计的最佳实践&#xff0c;旨在为企…...

鹏鼎控股社招校招入职SHL综合能力测评:高分攻略及真题题库解析答疑

鹏鼎控股&#xff08;深圳&#xff09;股份有限公司&#xff0c;成立于1999年4月29日&#xff0c;是一家专注于印制电路板&#xff08;PCB&#xff09;的设计、研发、制造与销售的高新技术企业。公司总部位于中国广东省深圳市&#xff0c;并在全球多个地区设有生产基地和服务中…...

【测向定位】差频MUSIC算法DOA估计【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;554073254 摘要 利用多频处理方法&#xff0c;在不产生空间混叠的情况下&#xff0c;估计出高频区域平面波的波达方向。该方法利用了差频&#xff08;DF&#xff09;&#xff0c;即两个高频之间的差。这使得能够在可…...

智能车镜头组入门(四)元素识别

元素识别是摄像头部分中难度最大的一部分&#xff0c;也是我花时间最长的一部分&#xff0c;前前后后画了很长时间&#xff0c;最后还是勉勉强强完成了。 基础的元素识别主要有两个&#xff1a;十字&#xff0c;圆环&#xff0c;和斑马线。十字要求直行&#xff0c;圆环需要进…...

Java键盘输入语句

编程输入语句 1.介绍:在编程中&#xff0c;需要接受用户输入的数据&#xff0c;就可以使用键盘输入语句来获取。 2.步骤&#xff1a; 1&#xff09;导入该类的所在包&#xff0c;java.util.* 2)创建该类对象&#xff08;声明变量&#xff09; 3&#xff09;调用里面的功能 3…...

【读书笔记-《30天自制操作系统》-22】Day23

本篇内容比较简单&#xff0c;集中于显示问题。首先编写了应用程序使用的api_malloc&#xff0c;然后实现了在窗口中画点与画线的API与应用程序。有了窗口显示&#xff0c;还要实现关闭窗口的功能&#xff0c;于是在键盘输入API的基础上实现了按下按键关闭窗口。最后发现用上文…...

C++学习笔记(33)

三十五、栈 示例&#xff1a; #include <iostream> using namespace std; typedef int ElemType; // 自定义链栈的数据元素为整数。 struct SNode // 链栈的结点。 { ElemType data; // 存放结点的数据元素。 struct SNode* next; // 指向下一个结点的指针。 }; // 初始化…...

智谱清影 -CogVideoX-2b-部署与使用,带你揭秘生成6s视频的极致体验!

文章目录 1 效果展示2 CogVideoX 前世今生3 CogVideoX 部署实践流程3.1 创建丹摩实例3.2 配置环境和依赖3.3 模型与配置文件3.4 运行4 遇到问题 1 效果展示 A street artist, clad in a worn-out denim jacket and a colorful bandana, stands before a vast concrete wall in …...

探索Java中的设计模式:原则与实例

探索Java中的设计模式&#xff1a;原则与实例 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入探讨Java中的设计模式&#xff0c;包括一些关键的设计原则和具体的实例。设计…...

【Java】关键字-static【主线学习笔记】

文章目录 前言关键字&#xff1a;static静态变量静态方法设置为静态的场景 下一篇 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台性和高效的执行速度&#xff0c;广受开发者喜爱。在接下来的学习过程中&#xff0c;我将记录学习过程中的基础语法、框架和…...

数字自然资源领域的实现路径

在数字化浪潮的推动下&#xff0c;自然资源的管理与利用正经历着前所未有的变革。本文将从测绘地理信息与遥感专业的角度&#xff0c;深度分析数字自然资源领域的实现路径。 1. 基础数据的数字化 数字自然资源的构建&#xff0c;首先需要实现基础数据的数字化。这包括地形地貌…...

GitLab邮箱发送邮件:如何实现自动化发信?

gitlab邮箱发送邮件设置教程&#xff1f;Gitlab邮箱配置和使用&#xff1f; GitLab不仅提供了代码版本控制、持续集成/持续部署等功能&#xff0c;还支持通过其内置的邮件功能实现自动化邮件发送。AokSend将深入探讨如何在GitLab中配置和使用邮箱发送邮件功能。 GitLab邮箱发…...

sqli-labs靶场搭建

下载了一个phpstudy进行搭靶场搭建 然后打开phpstudy安装好php,mysql等环境 正式sqli-labs靶场搭建 第一步&#xff1a;下载源码&#xff1a;https://codeload.github.com/Audi-1/sqli-labs/zip/master 解压后放进网站根目录&#xff0c;进到 sqli-labs的文件夹下&#xff0…...

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a;…...

每日刷题(算法)

我们N个真是太厉害了 思路&#xff1a; 我们先给数组排序&#xff0c;如果最小的元素不为1&#xff0c;那么肯定是吹牛的&#xff0c;我们拿一个变量记录前缀和&#xff0c;如果当前元素大于它前面所有元素的和1&#xff0c;那么sum1是不能到达的值。 代码&#xff1a; #def…...

大牛直播SDK核心音视频模块探究

技术背景 视沃科技旗下”大牛直播SDK”&#xff0c;始于2015年&#xff0c;致力于传统行业极致体验的音视频直播技术解决方案&#xff0c;产品涵盖跨平台的实时RTMP推流、RTMP/RTSP直播播放(支持RTSP|RTMP H.265&#xff0c;Enhanced RTMP H.265)、GB28181设备接入、推送端播放…...

gin配置swagger文档

一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…...

基于ssm的快餐店点餐系统设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来留言咨询。 一、摘要 进入二十一世纪以来&#xff0c;计…...

集合框架底层使用了什么数据结构

1.是什么 集合框架&#xff08;Collection Framework&#xff09;是Java标准库的一部分&#xff0c;它提供了一系列接口和实现类&#xff0c;用于处理不同类型的集合。这些集合可以用于存储和操作对象&#xff0c;如列表、集合、映射等。集合框架的底层数据结构是多种多样的&am…...

Activiti7《第二式:破剑式》——工作流中的以柔克刚

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。这篇文章将带你深入探讨工作流中的 “破剑式”&#xff0c;揭示如何通过 柔与刚 的结合来破解工作流的复杂性。本篇包含了 Activiti7 环境的进一步优化和表结构的深入分析&#xff0…...

docker快速搭建kafka

1、拉取镜像 kafka和 zk镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka:1.1.02、运行zk容器 docker run -itd --restart always --name zookeeper -p 2181:2181 wurstmeister/zookeeper3、运行kafka容器 192.168.31.112 这个地址为zk地址 docker…...

基于 onsemi NCV78343 NCV78964的汽车矩阵式大灯方案

一、方案描述 大联大世平集团针对汽车矩阵大灯&#xff0c;推出 基于 onsemi NCV78343 & NCV78964的汽车矩阵式大灯方案。 开发板搭载的主要器件有 onsemi 的 Matrix Controller NCV78343、LED Driver NCV78964、Motor Driver NCV70517、以及 NXP 的 MCU S32K344。 二、开…...

OpenAl o1论文:Let’s Verify Step by Step 快速解读

OpenAl又火了&#xff0c;这次是o1又带给大家惊艳。网上的博主已经有了真真假假的各种评测&#xff0c;我这篇来一点硬核的&#xff0c;解读OpenAl o1背后的论文&#xff1a;Let’s Verify Step by Step 大模型在给定的上下文资料正确的情况下也有可能出现幻觉&#xff0c;这篇…...

Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.

Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.Youmayincreasethelimitbyauthenticatingandupgrading:https://www.docker.com/increase−rate−limit.See ′ dockerrun−−help 在拉取docker进行的时候遇到这个问题,如何解决呢?本文提供的解决方…...

[2025]医院健康陪诊系统(源码+定制+服务)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Golang | Leetcode Golang题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; func toHex(num int) string {if num 0 {return "0"}sb : &strings.Builder{}for i : 7; i > 0; i-- {val : num >> (4 * i) & 0xfif val > 0 || sb.Len() > 0 {var digit byteif val < 10 {digit 0…...

VB中如何使用正则表达式(Regular Expressions)

在Visual Basic (VB) 中使用正则表达式&#xff0c;你需要依赖于.NET Framework的System.Text.RegularExpressions命名空间。这个命名空间提供了一系列的类&#xff0c;其中最常用的是Regex类&#xff0c;它允许你在VB.NET中执行复杂的文本搜索和替换操作。 以下是如何在VB.NE…...

Docker FROM 指定基础镜像

所谓定制镜像&#xff0c;其一定是以一个镜像为基础&#xff0c;在其上进行定制。 比如一个 nginx 镜像的容器&#xff0c;再进行修改一样&#xff0c;基础镜像是必须指定的。而 FROM 就是指定基础镜像&#xff0c;因此一个 Dockerfile 中 FROM 是必备的指令&#xff0c;并且必…...