C++ virtual实现

十一、机器学习进阶知识:径向基神经网络(RBFNN)的实现(Python,附源码及数据集) 本文对径向基神经网络(RBFNN)的理论基础及建模步骤进行介绍,之后使用Python实现基于RBFNN的数据预测,通俗易懂,适合新手学习,附源码及实验数据集。 阅读详情

虚函数和纯虚函数:

        虚函数用于实现多态,虚函数可以在基类中有实现,允许子类重写父类的函数实现,程序将根据对象的实际类型来决定调用哪个函数,而不仅仅是根据指针或引用的类型

        纯虚函数用于接口设计,要求子类必须重写父类的函数实现,父类作为抽象类,不能实例化

虚析构和纯虚析构:

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。

我们需要通过子类重写父类的析构函数来释放,即父类的析构函数改为虚析构或者纯虚析构

#include<iostream>
using namespace std;
#include<string>
//
//
//class animal{
//public:
//	virtual void speak() = 0;
//};
//
//class Cat : public animal{
//public:
//	Cat(string name){
//		cout << "构造函数调用!" << endl;
//		this->catName = new string(name);
//	}
//	void speak(){
//		cout << *catName <<"小猫在说话!" << endl;
//	}
//	string * catName;
//};
//
//void what(animal * animal){
//	animal->speak();
//	delete animal;
//}
//
//int main(){
//	what(new Cat("tom"));
//	system("pause");
//	return 0;
//}


class Animal {
public:

	Animal()
	{
		cout << "Animal 构造函数调用!" << endl;
	}
	virtual void Speak() = 0;

	//析构函数加上virtual关键字,变成虚析构函数
	virtual ~Animal()
	{
		cout << "Animal虚析构函数调用!" << endl;
	}


	//virtual ~Animal() = 0;
};

//Animal::~Animal()
//{
//	cout << "Animal 纯虚析构函数调用!" << endl;
//}

//和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能够被实例化。

class Cat : public Animal {
public:
	Cat(string name)
	{
		cout << "Cat构造函数调用!" << endl;
		m_Name = new string(name);
	}
	virtual void Speak()
	{
		cout << *m_Name << "小猫在说话!" << endl;
	}

	~Cat()
	{
		cout << "Cat析构函数调用!" << endl;
		if (this->m_Name != NULL) {
			delete m_Name;
			m_Name = NULL;
		}
	}

public:
	string *m_Name;
};

void test01()
{
	Animal *animal = new Cat("Tom");
	animal->Speak();

	//通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
	//怎么解决?给基类增加一个虚析构函数
	//虚析构函数就是用来解决通过父类指针释放子类对象
	delete animal;
}

int main() {

	test01();

	system("pause");

	return 0;
}

多态的应用:

父类指针或引用指向子类对象,会调用子类的实现

void PageMsgProc(uint32_t message, uint32_t param1, uint32_t param2)
{
	CPage* page = CPageManager::getInstance()->getCurrentPage();
	if (page && !page->PreMsgProc(message, param1, param2)) {
		page->MsgProc(message, param1, param2);
	}
}

S32DS3.5图形化配置实战:从零构建S32K144通信接口工程 本文详细介绍了如何使用S32DS3.5图形化配置工具从零构建S32K144通信接口工程。通过实战演示引脚配置、时钟树设置、SPI接口搭建等关键步骤,帮助开发者快速掌握NXP S32K系列开发技巧,提升嵌入式开发效率。特别针对S32DS3.5版本的新特性进行了深度解析,包括智能代码生成和调试优化方法。 阅读详情

相关推荐

告别PXE!用iPXE在CentOS 8.5上搭建一个能同时装Win11和Linux的万能网络启动盘

本文详细介绍了如何在CentOS 8.5上使用iPXE搭建支持Windows 11和Linux双系统部署的全能网络启动盘。通过对比传统PXE的局限性,展示了iPXE在HTTP协议支持、多架构适配和智能脚本方面的优势,提供从环境准备、服务配置到智能菜单开发的完整解决方案,显著提升系统部署效率。

weixin_29278805的博客 265

C++ Virtual关键字实现

Virtual功能 不加Virtual #include <iostream> using namespace std; class A{ public: void func(){ cout << "A" << endl; } }; class B: public A{ public: void func(){ cout << "B" <

云大的博客 246

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 376

C++中,virtual函数被继承后如何实现

在上面的例子中,Base 类有一个 virtual 函数 show(),Derived 类继承自 Base 并重写了 show() 函数。当我们调用 basePtr->show() 时,实际上执行的是 Derived 类中的 show() 函数,这就是多态性的体现。这样做有两个好处:一是可以确保你确实重写了基类中的函数(如果基类中没有这个函数,编译器会报错),二是可以提高代码的可读性,让读者更容易理解你的意图。// 通过基类指针指向派生类对象。// 调用的是派生类中的 show() 函数。

slty_123的博客 469

头歌MySQL数据库实训答案 有目录

头歌java实训答案集数据库部分一条一条的写,可鼠标手动粘贴,除特定命令外未分大小写。 第1关:创建数据库 第2关创建表 第3关:使用主键约束 第4关:外键约束 第5关:添加常用约束 MySQL数据库 - 数据库和表的基本操作(一) 第1关:查看表结构与修改表名 第2关:修改字段名与字段数据类型 第3关:添加与删除字段 第4关:修改字段的排列位置 第5关:删除表的外键约束 MySQL数据库 - 数据库和表的基本操作(二) 第1关:插入数据 第2关:更新数据 第3关:删除数据 MySQL数据库 - 单表查询(

m0_67401761的博客 4万+

Kolla 容器化 高可用OpenStack 部署与 Ceph 集群集成

本文介绍了 Kolla 项目在容器化 OpenStack 部署和管理方面的应用,以及与 Ceph 集群的集成。Kolla 项目通过容器技术提供了一种简化和自动化的 OpenStack 部署方法,同时实现了易于升级和回滚的特点。本文还探讨了 Kolla 在实现零宕机升级方面的进展,并分析了其对 OpenStack 用户和社区的重要意义。

we22635的博客 2702

C++ Virtual关键字实现动态绑定

C++中的动态绑定,是通过Virtual关键字来指定为虚函数,通过基类指针或引用调用。     示例代码: #include #include #include using namespace std; //学习Virtual,了解通过Virtual实现动态绑定 class Zone{ public: Zone(){ cout << "construct a zone" <<

maoyu123456789的专栏 429

SuperPoint + LightGlue实战:低纹理墙面重建保姆级教程(附完整代码)

本文提供了一份针对低纹理墙面三维重建的实战教程。通过详细解析SuperPoint与LightGlue的核心参数调优,指导读者如何有效提取并匹配低纹理目标的特征点,并结合COLMAP完成从稀疏到稠密的重建流程,最终实现高精度建模。

weixin_29034963的博客 223

【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态

在C++的早期设计中,通过基类指针可以访问派生类的成员变量,这是由于派生类对象在内存中的布局是基类成员变量在前,派生类成员变量在后。因此,当我们使用基类指针指向派生类对象时,可以正常访问到派生类中从基类继承来的成员变量。 然而,对于成员函数,情况就不同了。在编译时期,成员函数并不会被放入对象的内存空间中,而是存放在一块单独的内存区域,每个类只有一份成员函数的代码。当我们通过基类指针调用成员函数时,编译器会根据指针的静态类型(也就是基类类型)去查找对应的成员函数,而不是动态类型(也就是实际指向的派生类类型)

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3097

WRF中使用ERA5再分析数据

   本人在做一些实例时,需要用到最新的ERA5再分析数据集,其中我下载的是ERA5 hourly data on pressure levels form 1979 to present和ERA5 hourly data on single levels from 1979 to present中的3天数据。 1、注册climate copernicus账号 下载ERA5数据前先要注册其账号 2、选择变量    WRF中对于气象数据的字段有具体的要求, ......

GIS 8169

Raspberry Pi Pico SDK开发-Timer-定时

RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 本实例将演示如何使用Timer的定时功能。

视觉与物联智能 2040

Effective C++ 条款34 区分接口继承和实现继承,理解pure virtual, virtual, non-virtual成员函数

C++的成员函数继承体系中,有pure virtual, virtual, non-virtual3种类型的成员函数,需要深刻理解,前提是class B: public A(public继承条件下): 1、pure virtual(纯虚函数):派生类只继承基类的接口(声明)。但pure virtual也可以定义实现,定义的实现只在一种情况下有用,即:部分派生类(注意:此处是部分派生类)需要一个默...

cnkicq的专栏 269

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

C++中virtual的函数是否一定要被子类重新实现

在C++中,virtual函数并不一定要被子类重新实现(即重写或覆盖)。将函数声明为virtual的主要目的是允许在派生类(子类)中根据需要进行重写,以实现多态行为。然而,如果派生类没有提供特定的重写版本,那么它将继承基类中该virtual函数的默认行为。综上所述,virtual函数不一定要被子类重新实现,但如果希望利用多态性来根据对象的实际类型调用不同的函数实现,那么子类通常应该提供这些函数的重写版本。

slty_123的博客 772

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java与c++中多态的实现联系与区别应用virtual

c++比java的多态比较说明。 这个java简单的例子的输出是animal move,体现了多态的含义。 public class Test { public static void main(String []args){ Animal animal = new Dog(); animal.move(); } } class Animal{ void move(){ Syst...

diadestiny的博客 208

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

不使用virtual关键字实现C++多态

#include using namespace std; /* 不使用virtual实现多态可以用成员函数指针完成。 成员函数指针形式:返回类型(A::*指针名)(形参表) 其中A是类类型,即这个指针是指向A类的成员函数的函数指针 例如:int(A::*P)(int,int)这

iFuMI的博客 1359

virtual C++多态实现原理

1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3. 多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。 4. 多态用虚函数来实现,结合动态绑定。 5. 纯虚函数是虚函数再加上= 0。 6. 抽象类是指包

Do_Cool_Thing 1859

C++的继承以及virtual的底层实现

1.还是举每次讲继承都会举得一个例子:老师和学生都有人类的共同信息----姓名,性别,身份证等等,而学生有学工号,课表。老师有上班时间等等,所以在类中就有了继承这一说,子类继承父类。2.基本形式就是:比如,你用proctected继承的话,你就不可以切片了,就相当于父类=子类,可以复制一下下面的代码就会发现问题所在了。

Qianxueban的博客 341

C++ 中不能被继承的类实现,及从中体现virtual 继承的一个特性

C++ view第一期中给出了如何实现一个不能被继承的类的方法。 如下: #ifdef NDEBUG#define FINAL_CLASS#else#define FINAL_CLASS : public virtual Private::NonDerivableHelper //这里的关键是virtual 只要是virtual就不能继承#endifnamespace Private{ c...

weixin_33753003的博客 91

C++ virtual函数 实现机制

C++ 虚函数表解析前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方

雪伦的专栏 5807

C++中的virtual与inline:实现多态与内联调用的关键字

详细介绍了C++中的两个重要关键字:virtual和inline。virtual用于实现多态,允许子类重新定义父类的方法;而inline用于内联函数,可以在调用点直接展开函数体,以提高程序的运行效率。

qq_35320456的博客 1183

q集成了qt的Linux,Qt5 Virtual Keyboard C++集成与实现(QWidget)

Qt5 Virtual Keyboard C++集成与实现参考:一. 下载源代码二. 设置配置所需语言1). 通过Qt Creator配置打开Qt工程文件,点开左侧 Projects->Build->Build Steps->qmake->Additional arguments在 Additional arguments 增加配置参数:CONFIG+="lang-ar_A...

weixin_33603105的博客 1259

【C++】使用 virtual 和 = 0 来实现多态和抽象行为

这个语法实质上是在告诉编译器和其他开发者,任何派生自该类的类都必须实现这个函数,否则它们也会成为抽象类,不能实例化对象。当基类声明一个函数为虚函数时,C++ 运行时使用一种称为虚函数表(vtable)的机制来动态决定应调用哪个类的函数。这使得程序在运行时能够根据对象的实际类型来选择正确的函数版本,而不是编译时绑定的类型。的目的是允许通过基类指针或引用调用派生类的函数,这是多态的基础——即同一个函数调用可以表现出多种不同的行为。的函数将无法编译,迫使开发者检查并更新派生类以匹配新的基类接口。

qq_46049113的博客 786

virtual实现C++运行时多态

#include<stdio.h> class Shape{ public: Shape(int width,int height):mWidth(width),mHeight(height){ printf("shape constructor\n"); } long getArea(){ printf("shape getArea,width=%d,height=%d\n",mWidth,mHeight); retur.

努力的八戒 612

virtual 是 C++ 中的一个关键字,用于实现多态性(polymorphism)

是 C++ 中的一个关键字,用于实现多态性(polymorphism)。它的主要作用是在基类中声明虚函数(virtual function),允许派生类重写这些函数,并在运行时根据对象的实际类型调用适当的函数版本。关键字使得 C++ 支持运行时多态性,这意味着在程序运行时,根据对象的实际类型选择合适的函数版本。这种机制广泛应用于面向对象编程,尤其是在需要处理一组相关对象时,通过基类指针或引用统一操作。

m0_46376834的博客 987

C++ 不使用virtual实现多态

不使用virtual实现多态可以用成员函数指针完成。 成员函数指针形式:返回类型(A::*指针名)(形参表) 其中A是类类型,即这个指针是指向A类的成员函数的函数指针 例如:int(A::*P)(int,int)这是一个指向 “A类的带有两个int型形参且返回值是int的成员函数” ...

weixin_38168382的博客 139

【C++】多态 ② ( 面向对象中 “ 多态 “ 的真正需求 | 面向对象 “ 多态 “ 实现 - virtual 修饰函数 | 代码示例 )

一、多态实现 1、面向对象中 " 多态 " 的真正需求 2、面向对象 " 多态 " 实现 - virtual 修饰函数 二、代码示例 - 多态实现 1、代码示例 2、执行结果

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 849
上一篇: 奇怪的C函数
下一篇: makefile cmake
m_0806
博客等级 码龄7年 25粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值