c++ 菱形继承

一、菱形继承定义:假设有四个类:A、B、C 和 D,其中 B 和 C 都继承自 A,而 D 又继承自 B 和 C。这样的继承关系形成一个菱形结构:

    A/ \B   C\ /D

菱形继承的问题:菱形继承主要有数据冗余和二义性的问题,在这种结构中,类 D 继承自 B 和 C,同时 B 和 C 又都继承自 A。这就可能导致类 D 拥有两份 A 的成员,从而引起二义性。例如,假设类 A 有一个成员变量 x,那么类 D 会继承两份 x,一个来自 B,一个来自 C。当我们在 D 中访问 x 时,编译器不知道应该选择哪一个。
示例:

#include <iostream>
class A
{
public:A() : a(1){};void printA() { std::cout << a << std::endl; }int a;
};class B : public A
{};class C : public A
{
};class D : public B, public C
{
};int main(int argc, char *argv[])
{D d;std::cout << "对象d: "<<sizeof(d) << std::endl;std::cout << "类A: "<<sizeof(A) << std::endl;d.C::printA();d.B::printA();
}

解决方法
C++ 提供了虚继承(virtual inheritance)机制来解决菱形继承问题。通过虚继承,B 和 C 会共享同一个基类 A,而不会各自拥有独立的 A 的成员。具体实现方法如下:

#include <iostream>
class A
{
public:A() : a(1){};void printA() { std::cout << a << std::endl; }int a;
};class B : virtual public A
{
};class C : virtual public A
{
};class D : public B, public C
{
};int main(int argc, char *argv[])
{D d;std::cout << "对象d: " << sizeof(d) << std::endl;std::cout << "类A: " << sizeof(A) << std::endl;std::cout << "类B: " << sizeof(B) << std::endl;d.C::printA();d.B::printA();d.printA();  // 只有去掉二义性才能使用,否则只能使用上面方法调用
}

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

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

相关文章

【算法】前缀和

Hello&#xff01;大家好&#xff0c;我是学霸小羊&#xff0c;今天讲一下前缀和算法。 这要从一个故事说起。 一天&#xff0c;老师叫小明做一道题&#xff1a;一个长度为n的数组a&#xff0c;请你计算a[x]a[x1]a[x2] a[y-1]a[y]。 输入数据 第1行 1个整数n 0≤n≤1,000…

《STM32Cube高效开发教程基础篇》- 安装软件/Demo3_1LED

文章目录 下载两个软件安装问题记录在STM32CubeMX中新建项目编辑代码在CudeMX中完成图形化设置在CudeIdea中编码在CLion中编码&#xff08;智能化&#xff09; 效果图 下载两个软件 百度网盘链接&#xff1a;https://pan.baidu.com/s/1uXLWIIVCJbF4ZdvZ7k11Pw 提取码&#xff1…

Go 错误日志处理

是不是所有的 if err ! nil 的地方都应该输出错误日志&#xff1f; 打印过多的错误日志会导致日志文件变得冗长和难以阅读。 其次&#xff0c;重复的错误信息会增加冗余。 此外&#xff0c;每一层都打印错误日志&#xff0c;一旦错误信息设计不当&#xff0c;可能会导致上下…

消费者相关高效读写ZK作用

消费者分区分配策略 目录概述需求&#xff1a; 设计思路1.消费者分区分配策略2. 消费者offset的存储3. kafka消费者组案例4. kafka高效读写&Zk作用5. Ranger分区再分析 实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show …

MySQL建库

删除数据库 新建数据库 右键-新建数据库 字符集选中utf8(支持中文) 修改字符集 右键--数据库的属性 将字符集支持的数量变少可以修改

vue3 部署后修改配置文件

前端项目部署之后&#xff0c;运维可以自行修改配置文件里的接口IP&#xff0c;达到无需再次打包就可以使用的效果 vue2如何修改请看vue 部署后修改配置文件&#xff08;接口IP&#xff09;_vue部署后修改配置文件-CSDN博客 使用前提&#xff1a; vite搭建的vue3项目 使用setu…

大数据技术分享 | Kylin入门系列:基础介绍篇

Kylin入门教程 在大数据时代&#xff0c;如何高效地处理和分析海量数据成为了企业面临的挑战之一。Apache Kylin作为一个开源的分布式分析引擎&#xff0c;提供了Hadoop之上的SQL查询接口及多维分析&#xff08;OLAP&#xff09;能力&#xff0c;使得对超大规模数据集的分析变…

【leetcode——栈的题目】——1003. 检查替换后的词是否有效python

题目&#xff1a; 给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s 有效 需要满足&#xff1a;假设开始有一个空字符串 t "" &#xff0c;你可以执行 任意次 下述操作将 t 转换为 s &#xff1a; 将字符串 "abc" 插入到 t 中的任意位置…

前缀和(下)

目录 热身&#xff1a; 寻找数组的中心下标 题解&#xff1a; 代码&#xff1a; 进阶&#xff1a; 除自身之外数组的乘积 题解&#xff1a; 代码&#xff1a; 和为K的子数组 题解&#xff1a; 代码&#xff1a; 和可被 K 整除的子数组 题解&#xff1a; 同余定理…

Python多进程加快for循环速度

Python多进程加快for循环速度 你可以使用Python的multiprocessing模块来将for循环改为多进程实现。下面是一个简单的示例代码&#xff0c;演示了如何使用multiprocessing.Pool来并行执行一个for循环&#xff1a; import multiprocessing# 定义一个函数&#xff0c;该函数会在…

C语言 指针——指针变量做函数参数

目录 指针变量的解引用 为什么要用指针变量做函数参数&#xff1f; 演示Call by value 指针变量的解引用 为什么要用指针变量做函数参数&#xff1f; 演示Call by value

本特利330130-040-01-00 PLC模块深度解析 询价联系ID

本特利330130-040-01-00 PLC模块深度解析 在工业自动化领域&#xff0c;准确、高效的数据采集和监控是确保生产安全、提高生产效率的关键。本特利&#xff08;Bently Nevada&#xff09;作为全球知名的工业自动化和监控设备制造商&#xff0c;其生产的330130-040-01-00 PLC模块…

半藏酒业新零售分红制度拆解,起盘运营服务商

半藏酱酒招商模式&#xff0c;白酒合伙人模式&#xff0c;顶层模式设计 社群玩法用这几年的互联网词汇描述叫私域营销。虽然不走传统商超&#xff0c;酒桌之外很少能看到&#xff0c;但随着核心消费者裂变和流量汇聚&#xff0c;现在能见度越来越高&#xff0c;并溢出到达公域。…

Jtti:怎么在香港服务器上实现多点备份?

在香港服务器上实现多点备份可以采用多种方法和工具&#xff0c;主要目标是将数据备份到不同的存储位置&#xff0c;以增加数据的安全性和可靠性。以下是实现多点备份的一些常用方法&#xff1a; 1. 使用云存储服务 利用云存储服务将数据备份到不同的云存储提供商&#xff0c;以…

2024黑龙江CCPC

2024黑龙江省赛 B. String 思路:栈模拟代码&#xff1a; /* * Author: Hfuubigstrength * email: 2854614012qq.com * Date: 2024-05-28 23:32:45 */ #include <bits/stdc.h> //#define int long long #define PII pair<int,int> #define LL long long #defi…

深度学习:手撕 RNN(2)-RNN 的常见模型架构

本文首次发表于知乎&#xff0c;欢迎关注作者。 上一篇文章我们介绍了一个基本的 RNN 模块。有了 这个 RNN 模块后&#xff0c;就像搭积木一样&#xff0c;以 RNN 为基本单元&#xff0c;根据不同的任务或者需求&#xff0c;可以构建不同的模型架构。本节介绍的所有结构&#…

JS移动端设置mouseover,mouseleave有效么

在移动设备的浏览器环境中&#xff0c;mouseover 和 mouseleave 事件的行为与桌面浏览器有所不同&#xff0c;主要是因为移动设备的交互方式主要是基于触摸的&#xff0c;而不是基于鼠标的。 在移动设备上&#xff0c;当用户触摸屏幕时&#xff0c;通常会触发 touchstart 事件…

mysql查询的时间复杂度

SELECT * FROM customers WHERE age > 25; 首先是普通的select&#xff0c;如果没有建立任何的索引的话&#xff0c;假设数据量为N&#xff0c;那么时间复杂度为O(N) 如果对age添加了索引&#xff0c;那么复杂度为O(log n) 假设使用了in操作&#xff0c;总共查找M种&…

Codeforces Round 947 (Div. 1 + Div. 2) D. Paint the Tree 题解 DFS

Paint the Tree 题目描述 378QAQ has a tree with n n n vertices. Initially, all vertices are white. There are two chess pieces called P A P_A PA​ and P B P_B PB​ on the tree. P A P_A PA​ and P B P_B PB​ are initially located on vertices a a a an…

Spring Boot与MongoDB集成指南

1. 引言 在当今快速发展的软件开发领域&#xff0c;选择合适的技术栈对于构建高效、可扩展的应用程序至关重要。随着微服务架构和云原生应用的兴起&#xff0c;开发人员需要更灵活、更快速的解决方案来满足不断变化的业务需求。Spring Boot和MongoDB的结合正是这一需求的完美答…