C++ 98/03 应该学习哪些知识12

深入解析C++的演进:C++98到C++17 C++作为一门历史悠久的编程语言,其标准的演进是多年来编程实践不断进步和技术创新的集中体现。从最初于1983年被命名以来,C++经历了数个标准的迭代更新,每一个版本都为语言的表达能力、性能、安全性和易用性带来了重大改进。本章将概述C++从其诞生到现在主要标准的演进脉络,为读者揭示这一编程语言不断自我完善和发展的历程。首先,C++语言在1985年被Bjarne Stroustrup设计出来,并在1989年首次以“C with Classes”发布。随后,在1998年正式成为ISO标准,即C++98。 阅读详情

继承原理、虚继承、菱形继承

小白:嗨,大牛,我听说继承可以让我们的代码更加可复用,能否介绍一下继承的原理?

大牛:没错,继承是面向对象编程中的重要概念之一。通过继承,我们可以从已有的类中派生出新的类,新的类可以继承已有类的属性和方法,同时也可以新增自己的属性和方法。

小白:原来是这样啊。那什么是虚继承?

大牛:虚继承是一种特殊的继承方式,它主要用于解决继承链中出现的菱形继承问题。你知道什么是菱形继承吗?

小白:啊,这是什么鬼?跟菱形有什么关系?

大牛:哈哈,别着急,我们先说说菱形继承。菱形继承指的是一个派生类继承了两个直接或间接基类,而这两个基类又继承了同一个类。这样就会产生两份相同的基类成员,从而导致二义性问题。

小白:原来是这样,那怎么解决这个问题呢?

大牛:这就是虚继承派上用场的时候了。通过使用虚继承,我们可以保证只有一份共同的基类成员,从而避免二义性问题的产生。

小白:这么神奇,那我们来看一下虚继承的代码实现吧。

#include <iostream>

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

// 虚继承
class FlyingAnimal : virtual public Animal
{
public:
    virtual void fly() = 0;
};

// 虚继承
class Bird : virtual public Animal, virtual public FlyingAnimal
{
public:
    void makeSound() override
    {
        std::cout << "Chirp chirp!" << std::endl;
    }

    void fly() override
    {
        std::cout << "I'm flying!" << std::endl;
    }
};

int main()
{
    Bird b;
    b.makeSound();
    b.fly();

    return 0;
}

大牛:在上面的代码中,我们定义了一个抽象基类Animal,它有一个纯虚函数makeSound()。然后我们定义了一个FlyingAnimal类,它继承自Animal,并新增了一个纯虚函数fly()。最后,我们定义了一个Bird类,它同时继

承自Animal和FlyingAnimal,这里使用了虚继承。Bird类中实现了makeSound()和fly()函数,同时在main函数中创建了一个Bird对象,分别调用了makeSound()和fly()函数。

小白:哇,这个代码好神奇啊,虚继承真是好用!

大牛:是的,虚继承可以有效地解决菱形继承问题。不过需要注意的是,虚继承会增加程序的复杂度和开销,所以在使用时需要权衡利弊。

小白:好的,我明白了。谢谢你的讲解,大牛!

大牛:不用谢,如果有问题可以随时问我。

小白:好的,我还有一个问题,如果我不使用虚继承会发生什么情况呢?

大牛:如果不使用虚继承,在菱形继承中就会出现二义性问题。我们来看一下下面的代码:

#include <iostream>

class Animal
{
public:
    void makeSound()
    {
        std::cout << "Animal sound!" << std::endl;
    }
};

class FlyingAnimal : public Animal
{
public:
    void fly()
    {
        std::cout << "I'm flying!" << std::endl;
    }
};

class Bird : public Animal, public FlyingAnimal
{
public:
    void makeSound() override
    {
        std::cout << "Chirp chirp!" << std::endl;
    }
};

int main()
{
    Bird b;
    b.makeSound();
    b.fly();

    return 0;
}

在上面的代码中,我们定义了Animal、FlyingAnimal和Bird三个类。Animal类中有一个makeSound()函数,FlyingAnimal类继承了Animal类,并新增了一个fly()函数。最后,Bird类同时继承自Animal和FlyingAnimal类,并重写了makeSound()函数。在main函数中创建了一个Bird对象,分别调用了makeSound()和fly()函数。

小白:那么这个程序会发生什么情况呢?

大牛:如果你运行这个程序,你会发现makeSound()函数输出的是"Animal sound!"而不是"Chirp chirp!",这是因为Bird类同时继承了Animal和FlyingAnimal类,在调用makeSound()函数时会产生二义性问题,从而调用了Animal类中的makeSound()函数,而不是Bird类中重写的makeSound()函数。

小白:原来如此,那么使用虚继承就能解决这个问题了。

大牛:是的,虚继承可以解决这个问题,从而保证程序的正确性。

HWDB1.1数据集处理全攻略:从gnt文件到PNG图片的完整转换教程 本文提供了HWDB1.1数据集处理的完整教程,详细解析了gnt二进制文件格式,并给出了从文件解析、标签映射到批量转换为PNG图片的Python脚本。教程涵盖了环境准备、跨平台解压方案,以及为PyTorch等深度学习框架准备数据的最佳实践,是进行手写汉字识别研究不可或缺的实用指南。 阅读详情

相关推荐

使用mmdetection快速复现计算机视觉顶会论文

使用mmdetection中支持的算法运行自定义数据集

m0_56896669的博客 2424

C++学习笔记之多态

1,面向对象三要素:封装,继承,多态2,什么是多态:使基类的指针指向子类的对象如:Animal *p1 = new Dog;此时析构函数一定要申明为virtual,否则在程序结束时不会调用子类的析构函数3,多态实现过程:子类重写父类的方法代码中向父类型变量发出消息(静态绑定——&gt;在编译期进行)virtual 声明时构造函数不能为virtual运行时,根据变量实际引用的对象类型决定调用哪个方法...

wjd1994的博客 181

视频监控设备(NVR、IPC等)如何通过国标GB28181接入到视频监控平台,以及接入过程如何测试视频接入是否成功

GB/T28181标准广泛的应用,视频监控设备通过国标GB28181接入视频监控平台的过程变成程序化、标准化的互联过程,确保了视频监控设备能够在不同系统、不同网络环境下实现远程、跨区域、跨级别的访问和控制。版本有GB28181-2011、2016、2022几个常用版本,威迪斯特的视频监控平台完全支持GB28181的这几个版本,能够实现不同品牌视频监控设备的国标视频接入(国标视频监控接入),或者为国标28181视频接入(国标28181视频监控接入),也为国标281818接入(国标GB/T28181接入。

weixin_70208651的博客 1万+

c++ 多态与虚函数

c++ 多态与虚函数

m0_61650789的博客 892

EPICS电机支持(asynMotor)

EPICS电机支持(asynMotor)

yuyuyuliang00的博客 916

嵌入式存储进阶:除了KV存储,EasyFlash的IAP和LOG功能怎么玩?

本文深入探讨了嵌入式存储方案EasyFlash的高级功能,包括在线固件升级(IAP)和闪存日志存储(LOG)。通过详细解析IAP的双区备份设计和LOG的环形缓冲区架构,提供硬件适配、安全升级流程和日志管理技巧等实战指南,帮助开发者在物联网设备中实现可靠的数据存储和固件更新。

weixin_29280219的博客 414

C++98/03版本知识点汇总

1.类只在代码中出现,不会在运行的程序中出现,即编译时出现;对象在运行的程序中出现,并占用内存,是运行的实体; 2.消息传递的实质是方法的调用; 3.面向对象最突出的特征是:封装性、继承性、多态性 封装:将数据结构和作用在数据结构上的操作组成一个实体,单位是对象,提供动态代码共享; 继承性:提供静态的代码共享; 多态性:不同的对象收到相同的消息产生多种不同的行为方式 编译时的多态性:通

忘世麒麟的专栏 3220

【异常】Coze/扣子 Workflow 调用报 4200 错误深度解析

Coze API 的。

奶爸的编程之路,也就一周冷个三天 302

C++ 98/03 应该学习哪些知识13

new/delete和malloc/free

clayhell的博客 1177

【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】

在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的访问策略。当某些 Pod 接收的流量过多,而其他 Pod 的流量较少时,可能会导致负载不均衡。这种情况不仅影响性能,还可能导致某些 Pod 过载,影响应用的可用性。本文将详细分析此问题的原因及其解决方案。

颜淡慕潇 8740

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 330

UTF8-CPP跨版本兼容性指南:从C++98到C++20的完整支持

UTF8-CPP是一个轻量级的C++库,专注于以可移植的方式提供UTF-8编码和解码功能,支持从C++98到C++20的全版本C++标准。无论是处理多语言文本还是确保跨平台字符编码一致性,这个库都能为开发者提供可靠的解决方案。 ## 为什么选择UTF8-CPP? 在C++开发中,字符编码处理常常是跨平台项目的痛点。UTF8-CPP通过模块化设计,为不同C++标准提供针对性实现,确保代码在各种编

gitblog_01046的博客 933

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 429

C++ 98/03 应该学习哪些知识16

RAII 与 pimpl 惯用法

clayhell的博客 1157

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ 98/03 应该学习哪些知识19

迭代器、空间配置器理解

clayhell的博客 1468

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++11:基于C++98的语法更新

介绍了c++11中的一些变化以及新的语法。详细阐述了其实现方式和使用场景。

2201_75880188的博客 1206

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++ 的史诗级进化:从C++98到C++20

C++ 的史诗级进化:从C++98 - C++20 详解,含示例

不休的博客 1541

C++ 98/03 应该学习哪些知识15

类型转换方式

clayhell的博客 1078

C++ 98/03 应该学习哪些知识17

内存溢出和内存泄漏

clayhell的博客 1204

C++03 标准详解:C++98的技术修订版

C++03是C++98的技术修订版本,主要修正语言缺陷而非引入新特性。该标准澄清了容器成员函数的异常安全性、流状态处理、模板规则和初始化语法等100多处问题,增强了标准库规范,改善了与C99的兼容性,并统一了类型定义和名称查找规则。虽然变化细微,但C++03提高了语言的稳定性和可移植性,为后续C++11的重大更新奠定了基础。关键改进包括模板特化规则、值初始化语法和标准库头文件补充等。

C++发展史系列已完结,这段时间将会迎来系列作品——C++STL系列,敬请期待。作者邮箱:ljq20110324@outlook.com 684

C++11学习

C++11学习本章目的:当Android用ART虚拟机替代Dalvik的时候,为了表示和Dalvik彻底划清界限的决心,Google连ART虚拟机的实现代码都切换到了C++11。C+11的标准规范于2011年2月正式落稿,而此前10余年间,C++正式标准一直是C++98/03[①]。相比C++98/03,C++11有了非常多的变化,甚至一度让笔者大呼不认识C++了[②]。不过,作为科技行业的从业者

Innost的专栏 3万+

C++ 98/03 应该学习哪些知识7

C++ 面向对象语法

clayhell的博客 950

C++ 98/03 应该学习哪些知识5

C和C++区别

clayhell的博客 1110

C++ 98/03 应该学习哪些知识9

构造函数/析构函数/拷贝构造

clayhell的博客 1000

C++ 98/03 应该学习哪些知识18

STL标准模板库

clayhell的博客 1221

【C/C++ 12】C++98特性

C++98相比于C语言新增的特性,命名空间、缺省参数、函数重载、引用、内联函数、异常处理

phoenixFlyzzz的博客 1605
上一篇: C++ 98/03 应该学习哪些知识11
下一篇: C++ 98/03 应该学习哪些知识13
五百五。
博客等级 码龄7年 249粉丝 177原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值