【C++】易混淆——多继承和多态,虚继承和虚函数用法示例

ops/2024/12/17 7:04:53/

多继承不是多态

二者的区别如下:

多继承

  • 概念:指一个派生类可以同时继承多个基类的属性和方法。例如:
class Base1 {
public:void function1() {}
};class Base2 {
public:void function2() {}
};class Derived : public Base1, public Base2 {};
  • 目的:主要是为了复用多个类的代码,使派生类拥有多个基类的功能。

多态

  • 概念:是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在C++中,多态常通过虚函数来实现。例如:
class Shape {
public:virtual double area() = 0;
};class Circle : public Shape {
public:double area() override {// 计算圆面积的代码}
};class Square : public Shape {
public:double area() override {// 计算正方形面积的代码}
};
  • 目的:让程序能够在运行时根据对象的实际类型来选择正确的函数调用,增强了程序的灵活性和可扩展性。

多继承可以与多态结合使用。在多继承体系中,如果基类包含虚函数,派生类重写这些虚函数,就可以在多继承环境下实现多态性,使程序更加灵活和可扩展。

虚继承不是使用虚函数

以下是两者的区别:

虚继承

  • 目的:主要解决多继承时可能出现的菱形继承问题,即一个派生类可能间接多次继承同一个基类,导致数据冗余和二义性。例如:
class Base {
public:int data;
};
class Derived1 : virtual public Base {};
class Derived2 : virtual public Base {};
class FinalDerived : public Derived1, public Derived2 {};
  • 实现机制:在虚继承中,编译器会为虚继承的类添加一个指针(虚基类指针),指向虚基类的子对象,通过这个指针来解决成员访问的二义性问题。

虚函数

  • 目的:用于实现多态性,使派生类可以重写基类的函数,并且在运行时根据对象的实际类型调用相应的函数。例如:
class Shape {
public:virtual double getArea() = 0;
};
class Circle : public Shape {
public:double getArea() override {// 计算圆面积}
};
  • 实现机制:编译器会为包含虚函数的类创建一个虚函数表(vtable),类的对象中有一个虚函数表指针(vptr),指向该虚函数表,通过这个机制实现动态绑定。

http://www.ppmy.cn/ops/142579.html

相关文章

平衡二叉树

本节来学习判断一棵二叉树是否为平衡二叉树,并使用两种解决问题方法.第一种采用自顶向下的方式,效率不理想,第二种采用自下而上的方式,当发现不满足条件时终止.通过实例感受到程序设计思想对执行效率的重要影响. 问题描述: 给定一棵二叉树,判断该二叉树是否为平衡二叉树. 自顶…

VR虚拟展厅的实时互动是如何实现的?

VR虚拟展厅的实时互动是通过一系列技术和流程实现的,这些技术和流程共同确保了用户在虚拟环境中的互动体验能够及时响应和更新。 接下来,由专业从事VR虚拟展厅制作的圆桌3D云展厅平台为大家介绍一下实现VR虚拟展厅实时互动的几个关键要素: 高…

实验16 循环神经网络(3)

目录 1.数据处理 1.1.数据集下载 1.2.数据加载 1.2.1读取数据 1.2.2词表转换 1.2.3封装数据 2. 模型构建 2.1汇聚层算子 2.2模型汇总 3. 模型训练 3.1模型训练 3.2绘制准确率和损失函数图像 4. 模型评价 5. 模型预测 6. 基于Torch的单向LSTM 6.1模型修改-只返…

STUN服务器用于内网NAT的方案

在内网中部署 STUN 服务器的场景通常用于处理多层 NAT 或内网客户端之间的通信需求,尤其是在大企业或学校等复杂网络环境下。通过 STUN 服务器,可以帮助客户端设备检测和适配 NAT 转换规则,进而支持 WebRTC 或其他实时通信技术的正常运行。 …

深入探索 Flink DataStream API

Apache Flink 的 DataStream API 为处理无界数据流提供了强大而灵活的工具。以下将从五个模块详细介绍 DataStream API。 一、数据源模块 (一)数据读取方式 文件数据源: 支持多种文件格式:如文本文件(.txt&#xff0…

如何使用Nginx Proxy Manager实现反向代理与SSL支持高效管理网络服务

文章目录 前言1. 一键安装2. 本地访问3. Linux 安装cpolar4. 配置公网访问地址5. 公网远程访问6. 固定公网地址 前言 在网络管理和服务器运维中,反向代理是一个非常重要的技术。它不仅能够帮助你将内部的服务安全地暴露到外部环境,还能提供强大的负载均…

黑神话无缘TGA2024年度游戏的原因

1、黑猴无法成为TGA年度游戏的原因 TGA最终评选中玩家投票只占10%权重,媒体占据90%, 这样的规则就决定了黑猴大概率无法成为年度游戏, 跟金摇杆不同,金摇杆评选是玩家100%权重。 叠加黑猴的23000万套销量中大约12%是国区以外玩…

java后端API测试工具

1.postman 2. 3. 三者使用的情况差不多