C++中的虚函数及其实现方式

【C++入门】虚函数与多态 C++ 是一种功能强大的编程语言,以其面向对象编程(OOP)特性而闻名。虚函数和多态是 C++ 面向对象编程中的两个重要概念,它们使得代码更灵活、更具扩展性。本篇文章将介绍虚函数与多态,包括其定义、使用方法及其在实际编程中的作用。虚函数和多态是 C++ 中面向对象编程的重要特性,通过虚函数可以实现多态性,使得代码更加灵活和可扩展。虚函数允许在运行时通过基类指针或引用调用子类的重写方法,而纯虚函数则强制派生类实现某些方法,使得抽象类无法实例化。 阅读详情

首先看代码,不采用虚函数的情况

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;


class A {
private:
	int m_kk;
public:
	A() {
		m_kk = 100;
	}
	void print() {
		cout << "this is A" << endl;
		cout << m_kk << endl;
	}	
};
class B :public A {
public:
	void print(){
		cout << "this is B" << endl;
	}
};
int main()
{
	A a;
	B b;
	A* pa = &a;
	A* pb = &b;
	pa->print();
	pb->print();
	system("pause");
	return 0;

}

上述的两次输出均为“this is A 100”。证明在不采用虚函数的基础上,用父类的指针指向子类,是指向子类中父类的一部分。其行为和父类相同。

下面是采用虚函数的情况

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;


class A {
private:
	int m_kk;
public:
	A() {
		m_kk = 100;
	}
	virtual void print() {
		cout << "this is A" << endl;
		cout << m_kk << endl;
	}	
};
class B :public A {
public:
	virtual void print(){
		cout << "this is B" << endl;
	}
};
int main()
{
	A a;
	B b;
	A* pa = &a;
	A* pb = &b;
	pa->print();
	pb->print();
	system("pause");
	return 0;

}

输出为this is A 100 this is B.证明父类指针指向子类对象时,调用虚函数是调用子类中的实现。下面对虚函数的实现机理做阐释:

如果一个类中存在虚函数,编译器会为该类创建一个虚函数地址表(vtbl),保存自己类中虚函数的地址。并为改建创建一个指针(vptr),指向这个表。每个类的对象都会有一个vptr,该类的所有对象公用一个vtbl。

当执行上面的pb->print()时,系统会先获取pb的vtbr,得到vtbl后进行分析后得出结果。




用逐飞STC32G库做个智能小车:编码器测速、PWM调电机、ADC读电池电压(完整项目) 本文详细介绍了如何使用逐飞科技的STC32G12K128开源库构建智能小车项目,涵盖编码器测速、PWM电机控制和电池电压监测等核心功能。通过硬件选型、开发环境搭建、代码实现及调试技巧的全流程讲解,帮助开发者快速掌握基于STC32G的嵌入式系统开发,实现高性能的智能小车控制。 阅读详情

相关推荐

阿里云百炼平台创建智能体-上传文档

阿里云百炼智能体-上传文档文件

weixin_43930851的博客 1356

C++虚函数写在类外时的问题

对于大部分虚函数的实现是可以像普通函数一样,.h文件中声明,.cpp中实现。 但当虚函数中参数或返回值为不完整类型时,如果这样做就可能出现连接问题。 原因还不清楚,但是只要把类型变为完整类型(添加相应头文件),错误就得以解决。

flagshipii的博客 1727

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份全面的IEC61850通信协议测试验证实战指南,强调测试必须从理论走向工程实践。文章详细讲解了如何搭建测试环境,并深入剖析了MMS、GOOSE、SV三大核心协议的实战测试方法,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备的互操作性与通信可靠性。

weixin_29204121的博客 170

纯虚函数的实现案例:纯虚析构函数必须有实现

纯虚函数可以有实现:唯一麻烦就是必须在类的定义之外(cpp文件)实现它。 申明一个函数为纯虚并不意味着它没有实现,它意味着: 当前类是抽象类 ; 任何从此类派生的实体类必须将此函数申明为一个“普通”的虚函数(也就是说, 不能带“= 0”)。 1、纯虚函数例子: 声明一个pure virtual函数的目的是为了让derived classes只继承函数接口,派生类必须提供实现。 可以为pure ...

个人工作中学到的专业技术与职业发展知识笔记 3596

SOUL.md 人格定制的 7 个高阶技巧:Hermes Agent 精准控制 AI 行为模式

揭示 SOUL.md 的本质是行为契约而非人格设定,介绍7个围绕边界约束的高阶技巧,包括用上下文锚点(INPUT SCOPE/OUTPUT TARGET/CONSTRAINTS)替代角色描述、动态渲染锚点适配CI流程等,显著降低token消耗与人工review耗时。

weixin_42520239的博客 251

用 SAML 2.0 Bearer Assertion 配置 ABAP OAuth 2.0 令牌交换

摘要: SAP系统集成中,身份跨系统传递是关键挑战。OAuth 2.0的SAML 2.0 Bearer Assertion grant机制通过SAML断言换取访问令牌,实现安全身份传递。配置核心在ABAP的SOAUTH2事务码,需绑定可信SAML身份提供商(IdP)并指定访问范围。实际应用中,需确保SSL加密传输,正确配置SAML IdP信任关系,并为OAuth客户端分配专用系统用户。常见问题包括证书不匹配、权限配置不当等,需分层控制权限边界以保障安全。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 836

C++ 虚函数是否需要定义?

C++ 虚函数是否需要定义? 个人觉得这个问题比较重要。以下是鄙人在阅读了其他博客总结出来的,若有错误,希望得到大家的批评修改!谢谢! 问题: C++中的虚函数必须有定义吗? 答:若该类有实例化对象,则虚函数必须定义,而不是简单的声明。(1)若该类有实例化对象,在类中仅仅声明虚函数而没有定义实现,编译是不可以通过的,将会出现连接错误!(2)若该类没有实例化对象,则只声明不定义是可以通过编译的

徐麻子的专栏 2055

KingSCADA3.8保姆级安装教程

大家好,我是雷工!最近开始学习KingSCADA,今天这篇详细记录安装KingSCADA3.8的过程。首先下载需要的安装版本,此处以从官网下载的最新版本KingSCADA3.8为例,双击:Setup.exe;

做有价值的事,积累有价值的笔记! 1万+

C++的精髓——虚函数

纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。 class Cman { public: virtual void Eat(){……}; void Move(); private: }; class CChild : public CMan { public: vir

liujiayu2的专栏 557

10、硬件工程师笔试面试——继电器(2025版本)

在设计电路时,应综合考虑SSR的优势和局限性,确保选择合适的型号,并采取适当的设计措施来优化性能和可靠性。继电器的主要功能是利用较小的电流或电压来控制较大电流或电压的电路,实现信号的放大和隔离。在处理继电器故障时,应综合考虑电源、线圈、触点和负载等因素,及时进行故障诊断和处理,以确保电路系统的稳定性和安全性。由于汽车电子系统的复杂性,继电器的设计和选择必须考虑到系统的特定要求,包括电流容量、电压等级、环境条件(如温度、湿度、振动)以及所需的保护和隔离功能。确定线圈的工作电压或电流,以及吸合电压或电流。

XU157303764的博客 3733

【DRAM存储器五十六】LPDDR5介绍--WCK2CK Leveling和Read gate training

简述LPDDR5 WCK2CK leveling和read gate traning基本原理与操作步骤

highman110的博客 8788

CPP知识点复习归纳-是否需要析构函数和虚析构函数

先要了解什么是虚函数,如果一个类有派生类的话,那么在代码定义的时候用基类创建一个指针或引用,这个指针或引用,指向基类或者派生类,派生类可能会用到基类的一些方法,有可能会混淆,如果基类指针指向的是派生类,此时派生类对应的对象,在调用成员函数的时候,到底调用的是基类的成员函数还是派生类的成员函数。构造函数,调用顺序是先构造基类,再构造派生类,而调用析构函数恰好相反,先调用派生类析构函数,再调用基类析构函数,如果不作为基类,可以不定义虚析构函数,但是这个类有可能被别人拿去作为基类,就有可能会出现问题。

wade1010的专栏 936

【音视频基础】一篇搞懂视频的各种封装格式

在现代多媒体处理中,视频封装格式扮演着至关重要的角色。不同的封装格式决定了视频文件的存储方式、兼容性以及功能特性。无论是观看高清视频、编辑电影剪辑,还是在互联网上流式传输内容,理解各种视频封装格式的基础知识都是必不可少的。在这篇文章中,我们将详细介绍常见的视频封装格式,探讨为什么需要这些格式,以及它们各自的功能和区别,帮助你在选择和使用视频格式时做出更明智的决定。WEBM理解各种视频封装格式的功能和区别对于选择合适的格式至关重要。

m0_62599305的博客 2478

C++ 虚函数详解

文章目录虚函数的作用虚函数的原理:虚函数表指针和虚函数表虚函数表存储虚函数的顺序析构函数和虚函数纯虚函数 虚函数的作用 虚函数是为了实现动态多态。多态是指为不同的数据类型提供统一的接口,分为静态多态和动态多态。静态多态包括函数重载和模板函数,动态多态是:指针或引用类型可以根据运行中实际指向的派生类型的不同,来执行不同派生类的方法。 举个例子,有一个基类 Character 表示职业统称,玩家会选择职业战士 Warrior 或者魔法师 Magician,然后所有的逻辑例如攻击,防守都会根据玩家选择的不同职业有

竹剑单 9574

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c 虚函数 java_虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析c++虚函数1.定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数 [1]2.语法:virtual 函数返回类型 函数名(参数表) { 函数体 }3.用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数,也就是允许子类override父类同名方法。虚函数的作用是实现动态联编,也就是在程序...

weixin_42125192的博客 413

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

初识C++之虚函数

1、什么是虚函数   在基类中用virtual关键字修饰,并在一个或多个派生类中被重新定义的成员函数,用法格式为:   virtual 函数返回类型 函数名(参数表)    {     函数体    }    虚函数是实现多态性的关键,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。    看两个例子: ①没有定义基类的Fun函数为虚函数:#define _CRT_

ljx_5489464的博客 3813

【C++学习笔记 11】C++中的接口(纯虚函数)

原理上来讲,纯虚函数允许我们定义一个在基类中没有实现的函数,然后强制在子类中去实现这个函数。如果在基类中的虚函数带有实际函数体,那么在子类中重写函数是可写可不写的,这时调用的就是基类中的函数体。然而,在有些场景中,提供默认的函数体没有意义,实际上的需求只是强制子类为某个特定的函数提供自己的定义。在面向对象的程序设计中,创建一个只包含未实现的方法然后让子类去实现实际功能的做法非常普遍,这一般被称为接口(interface),即一个只包含未实现的方法并作为一个模板的类。

m0_59669215的博客 1548

C++ 多态和析构虚函数

  面试被问道具体名词解释,知道啥意思,表述不清。难受。 C++ 多态和析构虚函数C++ 多态和析构虚函数1. 多态含义2. 如何实现多态-虚函数3. 纯虚函数4. 析构函数5. 虚函数必须在外部实现6. 构造函数不能是虚函数7. 虚函数实现原理7.1.1. 虚函数类的构造7.1.2. 虚函数类的调用 C++ 多态和析构虚函数 注意: 1.一个类如果使用了虚函数,请把他的析构函数也改为虚函数。 2.保证至少有一个虚函数不是内联实现的。 1. 多态含义   多态,字面上看多态就是多种形态。类存在继承关系

Beyond欣 1177

C++中虚函数和纯虚函数的区别和常见使用方法

虚函数和纯虚函数的区别

daydayupfromnowon的专栏 1630

C++虚函数的实现机制——虚函数表

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

Stoneplay 549

C++中的虚函数的作用

 纯虚函数主要是你不知道这个函数如何定义,即你无法为其写出定义部分,这部分只有在子类中才能够正确表达,比如,我们要定义一个动物类,那它的呼吸方法怎么定义呢,是像鱼那样,还是像人那样,这个没法确定,只能在子类中去定义而虚函数则是肯定知道这个函数的定义,并且大部分子类对这方法的定义应该是差不多的,比如我们要定义一个树类,树都可以进行光合作用,大部分树其进行光合作用的方法都差不多吧,我们就可以将这个方法

wang7890的专栏 1380

多态,虚函数,纯虚函数

①多态:多态可以增加其灵活性,小程序凸显不出多态的威力。 1:创建类,定义虚函数            定义:  关键字:virtual 类型 名字(){}  虚函数对于多态具有决定性的作用,有虚函数才能构成多态 ) virtual 关键字仅用于函数声明,如果函数是在类外定义,则不需要再加上virtual关键字。 所有派生类中具有覆盖关系的同名函数都将自动成为虚函数。 2: 虚

laofengge的博客 4994

从逆向分析角度看C++虚函数

从逆向分析角度,粗略地分析了虚拟表的结构,本人才疏学浅,有误之处,望各位指正

个人技术博客 6220

虚函数,纯虚函数和多态

1.虚函数和纯虚函数(C,C++)    定义方式        虚函数:virtual void fun();可在父类中直接实现和定义父类的对象,也可在子类中重写父类中定义的虚函数。        纯虚函数:virtual void fun()=0;只能在父类(虚基类)中定义,继承的子类必须实现父类中的纯虚函数的功能。    执行方式:执行过程是动态联编的,即在程序运行时进行关联或束定。且动态联

ZH837964767的专栏 648

c c++ 函数内数组初值_C/C++虚函数的深入理解

我们都知道代码运行时各个系统会为各种对象分配内存,每个具体的函数其实就是一个具体的对象,那么系统在程序运行时也会为每个方法分配对应的内存。而且之前有讲过,为了避免内存的浪费,所有同类的对象是共享同一函数内存的。但是当有继承发生时,函数调用方式是怎么样的呢?本篇内容就让我们一起来看一下:普通函数的调用方式:假设这里有一个很简单的类Base我们实例化出来一个类(Base b)然后在vs里用调试模式看一...

weixin_39833687的博客 81

Java中的抽象函数与C++中的虚函数

1:Java中没有虚函数的概念,但是有抽象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某个抽象类的子类仍是抽象类,那么该子类不需要实现其父类的抽象函数。 2:C++中有虚函数的概念,用virtual关键字来表示,每个类都会有一个虚函数表,该虚函数表首先会从父类中继承得到父类的虚函数表, 如

1189

c++中的虚函数及虚函数表

一、虚函数的定义 有关键字virtual修饰的成员函数,为了实现多态。 二、虚函数表 1.虚函数表用来存放虚函数的地址,也称虚表。 2.一个含有虚函数的类中至少有一个虚表。 3.虚表指针:二级指针,虚函数指针的指针,存放在对象模型头部,32位系统中占4个字节,在64位系统中占8个字节。虚表指针中存放着虚表的首地址。可以通过对象实例化的地址得到虚函数表的地址。 4.虚表与虚表指针的关系如下: 三、...

sinat_38606329的博客 1419
上一篇: c++中的继承
下一篇: JAVA C# C/C++之比较学:参数传递
define_us
博客等级 码龄14年 157粉丝 531原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值