将不同类对象指针存放QVector中

2023-05-16

需求:将一系列操作步骤放在链表中按需调用。

我将每个操作步骤用一个类实现,将各类继承于一个基类,再将指向各子类的基类指针放在QVector/Vector,即可通过C++的多态实现调用各子类。

为此,我写了俩个范例测试代码.

一,各子类只单一继承同一基类

#include <iostream>
#include <vector>
using namespace std;
#include <QDebug>

class Base
{
public:
    virtual ~Base() {}
    virtual void printName();
};

void Base::printName()
{}

class Derived0 : public Base
{
public:
    ~Derived0();
    void printName();
};

Derived0::~Derived0()
{}

void Derived0::printName()
{
    qDebug() << "I am derived 0";
}

class Derived1 : public Base
{
public:
    ~Derived1();
    void printName();
};

Derived1::~Derived1()
{}

void Derived1::printName()
{
    qDebug() << "I am derived 1";
}

int main()
{
    QVector<Base*> classVector;

    Base* ptrDerived0 = new Derived0;
    classVector.push_back(ptrDerived0);

    Base* ptrDerived1 = new Derived1;
    classVector.push_back(ptrDerived1);

    QVector<Base*>::iterator end = classVector.end();
    for (QVector<Base*>::iterator it = classVector.begin(); it != end; ++it) {
        (*it)->printName();
    }

    system("pause");
    return 0;
}

注意点:

基类Base, 虽简单,注意点还不少,如下错误:

class Base                                                 //这样将出现两个警告错误
{                                                  //1,“Base" has virtual functions but non-virtual destructor Base有虚函数,却用了非虚析构函数
public:                              //2,Base‘ has no out-of-line virtual method definitions;its vtable will be emitted in every translation unit.
    virtual void printName() = 0;           //base没有类外部虚方法定义,它的虚方法表会给每个翻译单元发送消息
};

1,任何有一个虚拟方法及打算使用多态方法的C++基类,都必须包含一个虚析构函数。这有助于确保当利用基类的指针访问子类(多态)时,可调用子类的析构函数,避免内存泄露。可是,出现这种常见的C++编译错误时,大多数C++编译器并没有警示信息。感谢QT 的警示信息!

因此,加上 virtual ~Base() {}

2,网摘:  If a class is defined in a header file and has a vtable (either it has virtual methods or it derives from classes with virtual methods), it must always have at least one out-of-line virtual method in the class. Without this, the compiler will copy the vtable and RTTI into every .o file that #includes the header, bloating .o file sizes and increasing link times
译:如果一个类在头文件中定义,并且有一个虚方法表(不管是虚方法还是继承基类的虚方法),那么该类必须至少将一个虚方法定义在类定义外部。否则,编译器将会复制虚表和RTTI给每一个包含该头文件的目标.o文件,折将膨涨.o文件的大小,增加编译连接时间。

因此,将纯虚函数声明在类内部:virtual void printName();

在类定义外部:viod Base::printName(){}

后面就是两个子类Derived0,Derived1继承Base,并将指向他们的Base指针加入Vector了。

运行结果是正常的

I am derived 0
I am derived 1

二  各基类除了继承这个统一基类以外,还继承别的类。 多继承,因为我各个步骤类还都继承别的类,如QDialog等等

#include <iostream>
#include <vector>
using namespace std;
#include <QDebug>

enum classType{BaseType,Derived0Type,Derived1Type};

class Base
{
public:
    virtual ~Base() {}
    virtual void printName() = 0;
    virtual classType myTypeNum();
};

classType Base::myTypeNum()
{
    return BaseType;
}

class Base1
{
public:
    void printBelong();
};

void Base1::printBelong()
{
    qDebug() << "I derived from Base1 too!";
}

class Derived0 : public Base, public Base1
{
public:
    ~Derived0();
    classType myTypeNum();
    void printName();
};

Derived0::~Derived0()
{}

classType Derived0::myTypeNum()
{
    return Derived0Type;
}

void Derived0::printName()
{
    qDebug() << "I am derived 0";
}

class Derived1 : public Base, public Base1
{
public:
    ~Derived1();
    classType myTypeNum();
    void printName();
};

Derived1::~Derived1()
{}

classType Derived1::myTypeNum()
{
    return Derived1Type;
}

void Derived1::printName()
{
    qDebug() << "I am derived 1";
}

int main()
{
    QVector<Base*> classVector;

    Base* ptrDerived0 = new Derived0;
    classVector.push_back(ptrDerived0);

    Base* ptrDerived1 = new Derived1;
    classVector.push_back(ptrDerived1);

    QVector<Base*>::iterator end = classVector.end();
    for (QVector<Base*>::iterator it = classVector.begin(); it != end; ++it) {
        if((*it)->myTypeNum() == Derived0Type)
        {
            dynamic_cast<Derived0*>((*it))->printName();
            dynamic_cast<Derived0*>((*it))->printBelong();
        }
        else if((*it)->myTypeNum() == Derived1Type){
            dynamic_cast<Derived1*>((*it))->printName();
            dynamic_cast<Derived1*>((*it))->printBelong();
        }
    }

    system("pause");
    return 0;
}

这里,我设计了一个专门定义各类返回类型的枚举类型enum classType{BaseType,Derived0Type,Derived1Type};

基类Base中设计为虚方法,返回BaseType;Derived0返回Derived0Type;Derived1返回Derived1Type。

子类除了继承Base以外,还继承Base1.

那么为了子类能正常调用不同基类的虚方法,要将Vector中统一的Base指针转换为自己的指针,这里就需要上面classType帮助判断了。如

if((*it)->myTypeNum() == Derived0Type)
        {
            dynamic_cast<Derived0*>((*it))->printName();
            dynamic_cast<Derived0*>((*it))->printBelong();
        }

运行结果也是如我所愿的

I am derived 0
I derived from Base1 too!
I am derived 1
I derived from Base1 too!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将不同类对象指针存放QVector中 的相关文章

  • 修改conda环境和缓存默认路径

    默认情况下 xff0c conda 创建的新环境 以及过往安装的模块缓存都存储在用户目录下 xff0c 这一点不会在 conda xff08 user specific xff09 配置文件 HOME condarc 中体现出来 xff0c
  • 融合人体姿态估计和目标检测的学生课堂行为识别

    融合人体姿态估计和目标检测的学生课堂行为识别 参考网 摘要 xff1a 在課堂教学中 xff0c 人工智能技术可以帮助实现学生行为分析自动化 xff0c 让教师能够高效且直观地掌握学生学习行为投入的情况 xff0c 为后续优化教学设计与实施
  • Python实例详解pdfplumber读取PDF写入Excel

    一 Python操作PDF 13大库对比 PDF xff08 Portable Document Format xff09 是一种便携文档格式 xff0c 便于跨操作系统传播文档 PDF文档遵循标准格式 xff0c 因此存在很多可以操作PD
  • 如何使用ChatGPT API训练自定义知识库AI聊天机器人

    原文 xff1a 如何使用ChatGPT API训练自定义知识库AI聊天机器人 闪电博 在我们之前的文章中 xff0c 我们演示了如何用ChatGPT API建立一个AI聊天机器人 xff0c 并指定一个角色来进行个性化处理 但如果你想在自
  • 哈工大团队开源医学智能问诊大模型 | 华佗: 基于中文医学知识的LLaMa指令微调模型

    原文 xff1a CVHub 门头沟学院AI视觉实验室御用公众号 学术 科研 就业 185篇原创内容 公众号 Title HuaTuo Tuning LLaMA Model with Chinese Medical Knowledge PD
  • 开源数字人Fay

    原文 xff1a 别再因AI焦虑 xff0c 这波年轻人已经用 中国版ChatGPT 创业成功了 数字人 AI 创业 新浪新闻 开源 xff1a GitHub TheRamU Fay Fay是一个完整的开源项目 xff0c 包含Fay控制器
  • 推荐 3 个令你惊艳的 GitHub 项目

    原文 xff1a 推荐 3 个令你惊艳的 GitHub 项目 昨日 GitHub Trending 上榜的开源项目 xff0c 基于 AI 技术提高你的生产力 借助 AI 你能搭建自己的数字人 搭建自己的法律助手 文档分析助手 本期推荐开源
  • AI 数字人制作(方案一):输入一张图片和一段文字即可生成数字人

    方案一 xff1a 原文 xff1a AI 数字人制作 xff08 方案一 xff09 哔哩哔哩 bilibili AI 文字和图片生成数字人 输入一张图片和一段文字即可生成数字人 用三个开源项目整合成可以商用的数字人项目 文本生成语音开源
  • 大量数据情况下单线程插入和多线程insert数据库的性能测试

    大量数据情况下单线程插入和多线程insert数据库的性能测试 之前一直没有遇到过大批量数据入库的场景 xff0c 所以一直没有思考过在大量数据的情况下单线程插入和多线程插入的性能情况 今天在看一个项目源代码的时候发现使用了多线程insert
  • 查看tensorflow 安装目录

    使用命令 xff1a pip show f tensorflow 图和张量源码 xff1a C Program Files Anaconda3 Lib site packages tensorflow python framework op
  • FP-growth算法,fpgrowth算法详解

    FP growth算法 xff0c fpgrowth算法详解 使用FP growth算法来高效发现频繁项集 前言 你用过搜索引擎挥发现这样一个功能 xff1a 输入一个单词或者单词的一部分 xff0c 搜索引擎酒会自动补全查询词项 xff0
  • 如何将一个矩阵化为行阶梯形矩阵

    2016 03 29 尾巴 线性代数 有同学反映上一课过于冷冰冰 xff0c 都是一些不带证明的公式 如果线性代数所有公式都要证明的话 xff0c 线性代数的难度会上好几个量级 xff0c 有的公式的证明是特别特别难的 还有一个 xff0c
  • Activity启动模式与任务栈(Task)全面深入记录(上)

    转载请注明出处 xff08 谢谢 xff09 xff1a http blog csdn net javazejian article details 52071885 任务栈简单入门 最近又把两本进阶书看了一遍 xff0c 但总感觉好记性不
  • VSCode自定义代码片段3——url大全

    url大全 url 39 3 如何自定义用户代码片段 xff1a VSCode 61 左下角设置 61 用户代码片段 61 新建全局代码片段文件 61 自定义片段名称 61 编辑用户片段 61 ctrl 43 S 保存 url大全 34 P
  • mac中如何使用vsode愉快地运行C、C++程序

    闲来无事 xff0c 想在mac中写写C C 43 43 程序 xff0c 打开应用商店 xff0c 准备下个xcode玩玩 xff0c 结果小30G的空间占用直接劝退 因为一直使用vscode开发 xff0c 便萌生了使用插件来运行C C
  • CMake入门3之 静态链接库和动态链接库

    目录 目标 xff1a 环境 创建静态和动态链接库 文件准备 构建 安装静态链接库 使用静态链接库和动态库 使用动态库 使用静态库 目标 xff1a 构建静态链接库和动态链接库 xff0c 安装到系统 xff0c 写一个程序使用安装的静态链
  • 行人检测数据集

    MIT数据库 该数据库为较早公开的行人数据库 xff0c 共924张行人图片 xff08 ppm格式 xff0c 宽高为64 128 xff09 xff0c 肩到脚的距离约80象素 该数据库只含正面和背面两个视角 xff0c 无负样本 xf
  • opencv中solvePnPRansac函数求解相机位姿

    PnP xff08 Perspective n Points xff09 xff1a 2D 3D xff0c 求解相机位姿 PnP xff08 Perspective n Points xff09 就是你有n个点的3D位置和它们的投影 xf
  • 如何查看ubuntu下显卡驱动是否已经成功安装

    首先得安装 mesa utils xff0c 在终端输入命令 xff1a sudo apt get install mesa utils 然后再运行命令 xff1a glxinfo grep rendering 如果结果是 yes xff0
  • 深度学习笔记1:end-to-end、anchor box解释、人体检测代码

    SSD xff08 SSD Single Shot MultiBox Detector xff09 是采用单个深度神经网络模型实现目标检测和识别的方法 该方法是综合了Faster R CNN的anchor box和YOLO单个神经网络检测思

随机推荐

  • YOLO-darknet-on-Jetson-TX2

    YOLO darknet on Jetson TX2 https github com Alro10 YOLO darknet on Jetson TX2 software https blog csdn net cherry dr art
  • #error This file requires compiler and library support for the ISO C++ 2011错误解决办法

    CmakeLists txt 中添如下代码就OK include CheckCXXCompilerFlag CHECK CXX COMPILER FLAG 34 std 61 c 43 43 11 34 COMPILER SUPPORTS
  • docker pull 下来的镜像文件存放的位置

    参考文献 xff1a http www tuicool com articles bENrUf 1 存放在 var lib docker 2 repositories aufs 文件 xff1a 34 Repositories 34 34
  • docker主要命令整理

    docker docker info docker version docker images 展示镜像 docker ps 展示容器 docker ps a 会展示出所有正在运行的和已经停止的容器 docker rmi 镜像ID 删除镜像
  • python xml读写

    1 xml例子 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt annotation gt lt folder gt VOC2007 lt folder gt lt fil
  • caffe2编译问题:avx、avx2

    caffe2编译问题 xff1a 9898 init intrinsics check cc 54 CPU feature avx is present on your machine but the Caffe2 binary is no
  • 【Hello,电赛】2020电赛从备战到回顾(F题)

    瞎扯几句 2020应该让所有人难忘的一年 赋闲大半年 xff0c 开学两行泪 博主也是突然从大二被迫成了大三老油条 大一的时候身边就有同学开始展露科创竞赛方面的头角 xff0c 后来成了学院有名的带佬 咱当时觉得好玩也是羡慕 xff0c 奈
  • #C++#通过libcurl获取当前次HTTP请求的一些相关信息

    libcurl库是一个非常完整和好用的HTTP请求库 xff0c 通过它 xff0c 我们可以方便的书写HTTP请求程序 xff0c 而且不需要关心HTTP协议内部的细节处理 最近在做一个HTTP监测的程序 xff0c 就是通过libcur
  • 运行Maven Web项目出现 org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException错误

    异常问题描述 xff1a 初学Maven xff0c 新建了一个基于Web骨架的Web项目 xff0c jar 包也导好了 xff0c 作用域也设置正确了 xff0c Tomcat也正常运行了 xff0c 可是就是说编译错误 问题原因 由于
  • 解决mingw-w64外网下载太慢问题,离线包安装配置过程讲解

    常规安装程序下载地址 xff1a http www mingw w64 org doku php 但用安装程序直接安装mingw w64 xff0c 由于国际网络链路问题 xff0c 很难安装成功 xff0c 于是做了打包了一个离线包 xf
  • HTTP安全-nonce和timestamp在Http安全协议中的作用

    http www byywee com page M0 S591 591082 html 写道 前段时间给客户网站做新浪微博账号登录功能 xff0c 对 OAuth协议以及相关的一些安全协议做了一些研究 xff0c 顺便就记录一下学习心得吧
  • NVIDIA TensorRT使用记录

    1 准备工作 1 Pipeline train 在Host PC的GPU上训练test deployment 在TX1 TX2上部署使用 2 主机部署步骤 Running JetPack on the Host JetPack L4T 3
  • 用C语言实现串口通讯程序

    1 首先安装虚拟串口vspd软件 xff0c 用于创建虚拟串口进行互联调试 2 打开vspd软件 xff0c 选择COM1和COM4 xff0c 点击Add pair xff0c 把COM1和COM4互联 3 打开虚拟串口助手 xff0c
  • A2M7雷达在虚拟机的SLAM建图

    准备 Ubuntu18 04 雷达A2M7 一 前期准备 安装 建立工作空间并编译 mkdir p turtlebot ws src cd turtlebot ws src git clone https github com ncnynl
  • linux cmake分别指定编译/运行时动态库链接路径

    1 背景 在树莓派上开发执行程序 xff0c 需要用到opencv curl jsoncpp等库函数支持 xff0c apt get安装好后 xff0c 编译执行正常 但是执行程序挪到别的板子上 xff0c 都要apt get安装这些库 x
  • C语言函数库之字符串连接函数(string.h)

    1 字符串连接函数strcat 函数定义 xff1a char strcat char str1 const char str2 函数功能 xff1a 把str2 包括 39 0 39 拷贝到str1的尾部 连接 xff0c 并返回str1
  • foc学习笔记3——电流环

    foc学习笔记3 电流环 电流环的作用 前文不断强调 xff0c 进行磁场定向控制需要控制的是电流而非电压 xff0c 只是因为我们没有办法直接去控制电流才暂时退而求其次地去控制电压 虽然电压控制的效果也还不错 xff0c 但由于电机不是单
  • ESP32之蓝牙配网blufi

    概览 BluFi 是一款基于蓝牙通道的 Wi Fi 网络配置功能 xff0c 适用于 ESP32 它通过安全协议将 Wi Fi 配置和证书传输到 ESP32 xff0c 然后 ESP32 可基于这些信息连接到 AP 或建立 SoftAP B
  • 机器人学习之项目- Project2 :Where Am I?

    1 项目概述 欢迎来到 Where Am I 我在哪里 定位项目 在这个项目中 xff0c 将学习如何利用ROS AMCL包在Gazebo模拟环境的地图中准确地定位移动机器人 在完成本项目的过程中 xff0c 涉及机器人软件工程的几个方面
  • 将不同类对象指针存放QVector中

    需求 xff1a 将一系列操作步骤放在链表中按需调用 我将每个操作步骤用一个类实现 xff0c 将各类继承于一个基类 xff0c 再将指向各子类的基类指针放在QVector Vector xff0c 即可通过C 43 43 的多态实现调用各