c++总复习

embedded/2024/11/27 19:03:54/

1) 什么是 C++ 中的多继承?它有哪些优缺点?

多继承

在 C++ 中,多继承(Multiple Inheritance)是指一个类可以继承自多个基类。也就是说,一个子类可以有多个父类,这使得子类能够继承多个父类的属性和方法。

优点
  1. 代码复用:通过多继承,子类可以继承多个基类的功能,这提高了代码的复用性,减少了冗余代码的编写。
  2. 灵活性:多继承为类提供了更多的功能,可以从多个基类获得不同的功能,这使得设计更加灵活。
  3. 更强的表达能力:当设计较复杂的系统时,使用多继承可以更好地表达事物之间的多重关系。
缺点
  1. 二义性(Diamond Problem):当两个基类有相同的成员函数或成员变量时,子类会发生冲突或二义性问题。例如,如果父类A和B都有一个相同的方法,而类C继承了A和B,C就会不清楚该调用哪个父类的方法。
  2. 维护困难:多继承可能会使得代码复杂化,增加维护的难度。特别是在层次结构很深时,可能难以追踪继承关系。
  3. 不易理解:对于团队开发,尤其是新手来说,多继承的结构可能让代码变得难以理解和调试。
示例:
#include <iostream>
using namespace std;class A {
public:void showA() {cout << "Class A" << endl;}
};class B {
public:void showB() {cout << "Class B" << endl;}
};class C : public A, public B {
public:void showC() {cout << "Class C" << endl;}
};int main() {C obj;obj.showA();  // 继承自 Aobj.showB();  // 继承自 Bobj.showC();  // C 自己的return 0;
}

2) 什么是虚继承?为什么要使用虚继承?

虚继承

虚继承(Virtual Inheritance)是解决多继承中“钻石问题”的一种机制。当一个类从两个基类继承相同的父类时,虚继承可以确保这个公共的父类只有一份拷贝,而不是每个继承的类都会有一个拷贝。

为什么要使用虚继承

虚继承是为了解决 钻石问题(Diamond Problem),即当两个基类有共同的父类时,子类会继承两份该父类的成员,从而导致不确定性和重复数据。通过虚继承,C++ 确保只有一个基类副本,避免了冲突和不一致。

钻石问题示例
#include <iostream>
using namespace std;class A {
public:A() { cout << "A constructor" << endl; }
};class B : public A {
public:B() { cout << "B constructor" << endl; }
};class C : public A {
public:C() { cout << "C constructor" << endl; }
};// D 继承了 B 和 C,都会间接继承 A
class D : public B, public C {
public:D() { cout << "D constructor" << endl; }
};int main() {D obj;  // 会输出 4 次 A 的构造函数return 0;
}
使用虚继承

通过虚继承,C++ 确保基类 A 只会有一个副本。

#include <iostream>
using namespace std;class A {
public:A() { cout << "A constructor" << endl; }
};class B : virtual public A {
public:B() { cout << "B constructor" << endl; }
};class C : virtual public A {
public:C() { cout << "C constructor" << endl; }
};// D 继承了 B 和 C,只有一个 A
class D : public B, public C {
public:D() { cout << "D constructor" << endl; }
};int main() {D obj;  // 只会输出 1 次 A 的构造函数return 0;
}
虚继承的好处
  1. 避免冗余数据:确保继承自多个类的共同基类只有一个副本,避免重复和冗余。
  2. 解决钻石问题:通过虚继承,C++ 解决了多继承中出现的父类成员多次继承的问题,确保所有派生类共享父类的一个实例。
缺点
  1. 性能开销:虚继承通常需要在对象布局中使用指针来访问虚基类成员,这可能导致性能开销。
  2. 实现复杂性:虚继承增加了类的实现复杂度,需要引入虚基类指针等概念。

http://www.ppmy.cn/embedded/140979.html

相关文章

计算机视觉 1-8章 (硕士)

文章目录 零、前言1.先行课程&#xff1a;python、深度学习、数字图像处理2.查文献3.环境安装 第一章&#xff1a;概论1.计算机视觉的概念2.机器学习 第二章&#xff1a;图像处理相关基础1.图像的概念2.图像处理3.滤波器4.卷积神经网络CNN5.图像的多层表示&#xff1a;图像金字…

UE5_CommonUI简单使用

近在研究UE5的CommonUI,一开始觉得这个插件对于UI的设计开发来说似乎也没有什么更大的作用,奈何大家多少都有在用,索性我也看看吧。 以下是一些完整一些以及我看过的教程,跟着先看看: 视频: 【[英文直播]Common UI简介(官方字幕)】 https://www.bilibili.com/video/BV…

人工智能 实验8 搜索技术:A*八数码,一字棋游戏

每日例行赊赞 一、实验目的 &#xff08;1&#xff09;掌握搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉盲目搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&#xff09;…

LangChain——HTML文本分割 多种文本分割

Text Splitters 文本分割器 加载文档后&#xff0c;您通常会想要对其进行转换以更好地适合您的应用程序。最简单的例子是&#xff0c;您可能希望将长文档分割成更小的块&#xff0c;以适合模型的上下文窗口。 LangChain 有许多内置的文档转换器&#xff0c;可以轻松地拆分、组…

第九章 使用Apache服务部署静态网站

1. 网站服务程序 1970 年&#xff0c;作为互联网前身的 ARPANET&#xff08;阿帕网&#xff09;已初具雏形&#xff0c;并开始向非军用部门开放&#xff0c;许多大学和商业机构开始陆续接入。虽然彼时阿帕网的规模&#xff08;只有 4 台主机联网运行&#xff09;还不如现在的…

任意文件读取漏洞(CVE-2024-7928)修复

验证CVE-2024-7928问题是否存在可以使用如下方法&#xff1a; https://域名/index/ajax/lang?lang..//..//目录名/文件名&#xff08;不带后缀&#xff09; 目录名是该项目的一个目录&#xff0c;这里目录位置为nginx设置站点目录为基准&#xff0c;网上两层目录。 文件名…

AutoDL安装docker问题

在AutoDL上租了卡&#xff0c;安装docker遇到一些问题&#xff1a; 1.执行 sudo docker run hello-world 报错 docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决方法 先查看docker有没有启动&#xff0c;…

【如何获取股票数据02】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股历史交易数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…