虚函数、纯虚函数、多态

Linux C++:多态(虚函数和纯虚函数) 多态:按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派... 阅读详情

1、什么是虚函数和多态

虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。
多态指同一个方法根据其所属的不同对象可以有不同的行为(根据自己理解,不知这么说是否严谨)。

举个例子说明虚函数、多态、早绑定和晚绑定:
李氏两兄妹(哥哥和妹妹)参加姓氏运动会(不同姓氏组队参加),哥哥男子项目比赛,妹妹参加女子项目比赛,开幕式有一个参赛队伍代表发言仪式,兄妹俩都想去露露脸,可只能一人去,最终他们决定到时抓阄决定,而组委会也不反对,它才不关心是哥哥还是妹妹来发言,只要派一个姓李的来说两句话就行。运动会如期举行,妹妹抓阄获得代表李家发言的机会,哥哥参加了男子项目比赛,妹妹参加了女子项目比赛。比赛结果就不是我们关心的了。
现在让我们来做个类比(只讨论与运动会相关的话题):
(1)类的设计:
李氏兄妹属于李氏家族,李氏是基类(这里还是抽象的纯基类),李氏又派生出两个子类(李氏男和李氏女),李氏男会所有男子项目的比赛(李氏男的成员函数),李氏女会所有女子项目的比赛(李氏女的成员函数)。姓李的人都会发言(基类虚函数),李氏男和李氏女继承自李氏当然也会发言,只是男女说话声音不一样,内容也会又差异,给人感觉不同(李氏男和李氏女分别重新定义发言这个虚函数)。李氏两兄妹就是李氏男和李氏女两个类的实体。
(2)程序设计:
李氏兄妹填写参赛报名表。
(3)编译:
李氏兄妹的参赛报名表被上交给组委会(编译器),哥哥和妹妹分别参加男子和女子的比赛,组委会一看就明白了(早绑定),只是发言人选不明确,组委会看到报名表上写的是“李家代表”(基类指针),组委会不能确定到底是谁,就做了个备注:如果是男的,就是哥哥李某某;如果是女的,就是妹妹李某某(晚绑定)。组委会做好其它准备工作后,就等运动会开始了(编译完毕)。
(4)程序运行:
运动会开始了(程序开始运行),开幕式上我们听到了李家妹妹的发言,如果是哥哥运气好抓阄胜出,我们将听到哥哥的发言(多态)。然后就是看到兄妹俩参加比赛了。。。

但愿这个比喻说清楚了虚函数、多态、早绑定和晚绑定的概念和它们之间的关系。再说一下,早绑定指编译器在编译期间即知道对象的具体类型并确定此对象调用成员函数的确切地址;而晚绑定是根据指针所指对象的类型信息得到类的虚函数表指针进而确定调用成员函数的确切地址。
 

2、揭密晚绑定的秘密

编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟。

编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。在V TA B L E中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。为每个类设置V TA B L E、初始化V P T R、为虚函数调用插入代码,所有这些都是自动发生的,所以我们不必担心这些。利用虚函数,这个对象的合适的函数就能被调用,哪怕在编译器还不知道这个对象的特定类型的情况下。(《C++编程思想》)

在任何类中不存在显示的类型信息,可对象中必须存放类信息,否则类型不可能在运行时建立。那这个类信息是什么呢?我们来看下面几个类:

class no_virtual
{
public:
    void fun1() const{}
    int  fun2() const { return a; }
private:
    int a;
}

class one_virtual
{
public:
    virtual void fun1() const{}
    int  fun2() const { return a; }
private:
    int a;
}

class two_virtual
{
public:
    virtual void fun1() const{}
    virtual int  fun2() const { return a; }
private:
    int a;
}

以上三个类中:
no_virtual没有虚函数,sizeof(no_virtual)=4,类no_virtual的长度就是其成员变量整型a的长度;
one_virtual有一个虚函数,sizeof(one_virtual)=8;
two_virtual有两个虚函数,sizeof(two_virtual)=8; 有一个虚函数和两个虚函数的类的长度没有区别,其实它们的长度就是no_virtual的长度加一个void指针的长度,它反映出,如果有一个或多个虚函数,编译器在这个结构中插入一个指针( V P T R)。在one_virtual 和two_virtual之间没有区别。这是因为V P T R指向一个存放地址的表,只需要一个指针,因为所有虚函数地址都包含在这个表中。

这个VPTR就可以看作类的类型信息。

那我们来看看编译器是怎么建立VPTR指向的这个虚函数表的。先看下面两个类:
class base
{
public:
    void bfun(){}
    virtual void vfun1(){}
    virtual int vfun2(){}
private:
    int a;
}

class derived : public base
{
public:
    void dfun(){}
    virtual void vfun1(){}
    virtual int vfun3(){}
private:
    int b;
}

两个类VPTR指向的虚函数表(VTABLE)分别如下:
base类
                      ——————
VPTR——> |&base::vfun1 |
                      ——————
                 |&base::vfun2 |
                  ——————
     
derived类
                      ———————
VPTR——> |&derived::vfun1 |
                      ———————
                  |&base::vfun2    |
                  ———————
                  |&derived::vfun3 |
                   ———————
   
每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时,编译器就为这个类创建一个VTABLE,如上图所示。在这个表中,编译器放置了在这个类中或在它的基类中所有已声明为virtual的函数的地址。如果在这个派生类中没有对在基类中声明为virtual的函数进行重新定义,编译器就使用基类的这个虚函数地址。(在derived的VTABLE中,vfun2的入口就是这种情况。)然后编译器在这个类中放置VPTR。当使用简单继承时,对于每个对象只有一个VPTR。VPTR必须被初始化为指向相应的VTABLE,这在构造函数中发生。
一旦VPTR被初始化为指向相应的VTABLE,对象就"知道"它自己是什么类型。但只有当虚函数被调用时这种自我认知才有用。

VPTR常常位于对象的开头,编译器能很容易地取到VPTR的值,从而确定VTABLE的位置。VPTR总指向VTABLE的开始地址,所有基类和它的子类的虚函数地址(子类自己定义的虚函数除外)在VTABLE中存储的位置总是相同的,如上面base类和derived类的VTABLE中vfun1和vfun2的地址总是按相同的顺序存储。编译器知道vfun1位于VPTR处,vfun2位于VPTR+1处,因此在用基类指针调用虚函数时,编译器首先获取指针指向对象的类型信息(VPTR),然后就去调用虚函数。如一个base类指针pBase指向了一个derived对象,那pBase->vfun2()被编译器翻译为 VPTR+1 的调用,因为虚函数vfun2的地址在VTABLE中位于索引为1的位置上。同理,pBase->vfun3()被编译器翻译为 VPTR+2的调用。这就是所谓的晚绑定。

我们来看一下虚函数调用的汇编代码,以加深理解。

void test(base* pBase)
{
 pBase->vfun2();
}

int main(int argc, char* argv[])
{
 derived td;
 


 test(&td);
 
 return 0;
}

derived td;编译生成的汇编代码如下:
 mov DWORD PTR _td$[esp+24], OFFSET FLAT:??_7derived@@6B@ ; derived::`vftable'
 由编译器的注释可知,此时PTR _td$[esp+24]中存储的就是derived类的VTABLE地址。
 
test(&td);编译生成的汇编代码如下:
 lea eax, DWORD PTR _td$[esp+24]   
 mov DWORD PTR __$EHRec$[esp+32], 0
 push eax
 call ?test@@YAXPAVbase@@@Z   ; test
 调用test函数时完成了如下工作:取对象td的地址,将其压栈,然后调用test。

pBase->vfun2();编译生成的汇编代码如下:
  mov ecx, DWORD PTR _pBase$[esp-4]
 mov eax, DWORD PTR [ecx]
 jmp DWORD PTR [eax+4]
 首先从栈中取出pBase指针指向的对象地址赋给ecx,然后取对象开头的指针变量中的地址赋给eax,此时eax的值即为VPTR的值,也就是VTABLE的地址。最后就是调用虚函数了,由于vfun2位于VTABLE的第二个位置,相当于 VPTR+1,每个函数指针是4个字节长,所以最后的调用被编译器翻译为 jmp DWORD PTR [eax+4]。如果是调用pBase->vfun1(),这句就该被编译为jmp DWORD PTR [eax]。
 

现在应该对多态、虚函数、晚绑定有比较清楚的了解了吧。
如有不当之处,欢迎讨论!

 

 

 

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

 

在C++中的一种函数申明被称之为:纯虚函数(pure virtual function).它的申明格式如下:

class CShape
{
public:
    virtual void Show()=0;
};
注意红色部分,在普通的虚函数后面加上"=0"这样就声明了一个pure virtual function.
   在什么情况下使用纯虚函数(pure vitrual function)?
1,当想在基类中抽象出一个方法,且该基类只做能被继承,而不能被实例化;
2,这个方法必须在派生类(derived class)中被实现;
   如果满足以上两点,可以考虑将该方法申明为pure virtual function.
我们来举个例子,我们先定义一个形状的类(Cshape),但凡是形状我们都要求其能显示自己。所以我们定义了一个类如下:
class CShape
{
    virtual void Show(){};
};
但没有CShape这种形状,因此我们不想让CShape这个类被实例化,我们首先想到的是将Show函数的定义(实现)部分删除如下:
class CShape
{
    virtual void Show();
};
当我们使用下面的语句实例化一个CShape时:
CShape cs; //这是我们不允许的,但仅用上面的代码是可以通过编译(但link时失败)。
   怎么样避免一个CShape被实例化,且在编译时就被发现?
答案是:使用pure virtual funcion.
我们再次修改CShape类如下:
class CShape
{
public:
    virtual void Show()=0;
};
这时在实例化CShape时就会有以下报错信息:
error C2259: 'CShape' : cannot instantiate abstract class due to following members:
warning C4259: 'void __thiscall CShape::Show(void)' : pure virtual function was not defined
   我们再来看看被继承的情况,我们需要一个CPoint2D的类,它继承自CShape.他必须实现基类(CShape)中的Show()方法。
   其实使用最初的本意是让每一个派生自CShape的类,都要实现Show()方法,但时常我们可能在一个派生类中忘记了实现Show(),为了避免这种情况,pure virtual funcion发挥作用了。
    我们看以下代码:
class CPoint2D:public CShape
{
public:
CPoint2D()
{
   printf("CPoint2D ctor is invoked/n");
};
void Msg()
{
   printf("CPoint2D.Msg() is invoked/n");
};
/*---I'm sorry to forget implement the Show()---
void Show()
{
   printf("Show() from CPoint2D/n");
};
------------------------------------------------*/
};
当我们实例化CPoint2D时,在编译时(at the compiling)也会出现如下的报错:
error C2259: 'CShape' : cannot instantiate abstract class due to following members:
warning C4259: 'void __thiscall CShape::Show(void)' : pure virtual function was not defined
   如上,我们预防了在派生类中忘记实现基类方法。
也许compiler会说:
哼!如果不在派生类的中实现在Show方法,我编译都不会让你通过。
//--------------------------------------------------------
//now,show the completed code,
//Platform:Winxp+VC6.0
//--------------
#include <iostream>
#include <stdio.h>
using namespace std;
class CShape
{
public:
virtual void Show()=0;
};
class CPoint2D:public CShape
{
public:
void Msg()
{
   printf("CPoint2D.Msg() is invoked/n");
};
/*---I'm sorry to forget implementation of the Show()--- */
void Show()
{
   printf("Show() from CPoint2D/n");
};
/*------------------------------------------------------*/
};
void main()
{
CPoint2D p2d;   //如果派生类(CPoint2D)没有实现Show(),则编译不通过
p2d.Msg();
//
CShape *pShape = &p2d;
pShape->Show();
//不能实例化基类
//CShape cs;
}

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

 

多态、虚函数与纯虚函数详解 在面向对象编程(OOP)中,多态(Polymorphism)、虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)是三个非常重要的概念。它们使得代码更加灵活、可扩展,并且支持接口抽象。本文将详细介绍这些概念,并通过C++代码示例来展示它们的使用。 阅读详情

相关推荐

【客户案例】母婴行业头部品牌是如何做私域的

各品牌争相跑马圈地,想方设法圈住流量,建立品牌资产;私域运营是一项“重人力”的工作,在传统的品牌运营过程中,私域操盘手经常会由于一对多导致无法兼顾,只能通过提高触达次数的方式加大漏斗,这样难以让每个社群都发挥出应有的价值,甚至还会导致一定程度的用户流失。除了宝妈身份外激发的用户认同感、亲密度外,KOC们作为产品的使用者,自由选择的推品和自由创作的推广文案都更具有真实性、代表性,能够极大程度激发群友们的信任感,从而愿意为产品买单,转化复购水到渠成。不同阶段的宝妈,母婴知识的储存量和经验是不同的,K品牌还会。.

圈量SCRM系统-企微营销工具-私域流量运营软件 948

C++:多态与虚函数,纯虚函数

C++:多态与虚函数,纯虚函数

a2998658795的博客 902

汇川AM402、H3U和上位机C#ModebusTcp通讯

目录一、测试任务二、测试环境三、PLC工程1、组态配置2、ip地址、端口号 3、全局变量定义四、C#端Winform程序创建1创建主界面 2、创建子窗口 3、运行生成,界面效果4、Modebus协议说明5、Modebus操作说明六、测试1、寄存器读测试 2、MW1300寄存器的BIT位3、写寄存器测试4、PLC断电或者断网 七、工程下载连接1、PLC作为ModebusTCP端,端口号都是502,PC端上位机软件作为TcpClient去连接多台PLC。PC端读写PLC寄存器。2、PC端在有的PLC断电、断网的

panjinliang066333的博客 2万+

C++虚函数和多态学习笔记

1、什么是虚函数和多态虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。多态指同一个方法根据其所属的不同对象可以有不同的行为(根据自己理解,不知这么说是否严谨)。举个例子说明虚函数、多态、早绑定和晚绑定:李氏两...

bodybo的专栏 1368

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 859

Windows服务器SSL漏洞修复实战:如何一键禁用TLS 1.0/1.1避免SWEET32攻击

本文提供了Windows服务器修复SWEET32漏洞的实战指南。通过组策略编辑器,详细讲解如何一键禁用不安全的TLS 1.0/1.1协议,并优化密码套件顺序,以消除由3DES等弱加密算法带来的安全风险。文章还涵盖了应对SQL Server等应用兼容性挑战的解决方案,以及企业级批量部署的脚本化方法,帮助管理员系统性地提升服务器TLS/SSL安全配置。

weixin_29310631的博客 246

多态,虚函数,纯虚函数

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

laofengge的博客 4994

VisionMaster位置修正功能深度解析:如何让找圆工具自动跟随移动目标?

本文深度解析海康威视VisionMaster平台的位置修正功能,重点介绍如何通过模板匹配与找圆工具的智能联动实现移动目标的动态追踪。文章详细阐述了工业视觉检测中的坐标系同步原理、模板匹配配置技巧及异常处理策略,为工程师提供了一套完整的工业级解决方案。

uu89012的博客 281

虚函数,纯虚函数,多态

虚函数:前面有virtual,在父类里面有定义,有实现。如: virtual void xuhanshu(){ cout<<"Im xuhanshu"<<endl } 纯虚函数:前面有virtual,在父类里面有定义,但是不实现。后面必须跟“=0”,如: virtual void chunxu()=0; 二者格式: 虚函数-- virtual xuhanshu(){ method body }; 纯虚函数--virtual chunxu()=0;...

Xueqian E的博客 558

【大模型12步学习路线 · 第3步 · ③IC验证实战篇】SOTA Prompt 逐字拆解

本文拆解了4篇SOTA LLM4Verification论文的Prompt设计,重点分析了AssertLLM、RTLFixer等模型在IC验证领域的Prompt工程实践。AssertLLM通过任务分解为3个专用LLM(Spec分析、信号映射、SVA生成),结合领域RAG和定制System Prompt,将SVA准确率从GPT-4的8%提升至89%。RTLFixer采用ReAct框架实现98.5%的RTL语法错误修复率。文章总结了Prompt设计的关键技巧:任务分解、结构化输出、置信度评分、允许"不确定"标记

元直的博客 584

40.8K星爆火!Crawl4AI实战突破Cloudflare 5秒盾:AI反爬新范式,爬虫再也不被封

Crawl4AI的爆火(40.8K星)不是偶然——它解决了爬虫工程师最头疼的反爬问题,让爬虫从“体力活”变成“脑力活”,不用再花费大量时间配置指纹、编写行为脚本。但要注意:爬虫必须遵守目标网站的robots.txt协议,不得用于非法爬取数据(比如用户隐私、商业机密)。合理使用技术,才能长久落地。如果你在使用Crawl4AI时遇到具体问题(比如绕过更严格的反爬、批量爬取配置),欢迎在评论区交流,我会第一时间分享解决方案!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1603

虚函数和多态

虚函数和多态的基础知识

Ryzen3的博客 2654

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

11、虚函数、多态、纯虚函数

当编译器看到通过指针或引用调用虚函数的语句时,并不急于生成有关函数跳转的指令,相反编译器会用一段代码替代该语句,这段代码在运行时才能被执行,完成如下操作。如果子类的成员函数和基类的虚函数具有相同的函数签名,那么该成员函数就也是虚函数,无论其是否带有virtual关键字。调用虚函数的指针也可以是基类中的this指针,同样能满足多态的条件,但在构造和析构函数中除外。virtual 返回值 函数名(形参表) { …的成员函数,称为纯虚函数或抽象方法。形如class 类名{形如class 类名{

Salted fish in hand, I have the world. 977

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++ 之多态性、虚函数和纯虚函数

多态性 多态性的概念 多态性是面向对象程序设计的重要特征之一,它与封装和继承一起构成面向对象程序设计的三大特征。 多态性是指当不同对象收到相同的消息时产生不同的动作。 多态性的形式 C++支持两种形式的多态性: 第一种是编译时多态,称为静态联编。是指程序在编译前确定的多态性,是通过重载机制来实现的包括:函数重载和运算符重载。 第二种是运行时多态,称为动态联编。是指必须在运行中才可以确定的多态性,是通过继承和虚函数来实现的。 虚函数 虚函数的定义 虚函数:在类的成员函数前加virtual关键字。

xp_fangfei的博客 1384

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++多态, 虚函数, 纯虚函数

多态:不同对象接收相同的消息产生不同的动作。多态包括编译时多态和运行时多态   运行时多态是:通过继承和虚函数来体现的。 编译时多态:运算符重载上。 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。多态也有代码重用的功能,还有解决项目中紧耦合的问题,提高程序的可扩展性。C++实现多态的机制很简单,在继承体系下,将父类的某个函数...

yangxueyangxue的博客 972

C++中虚函数与纯虚函数(以及函数重写/重载,隐藏,多态等

虚函数与纯虚函数 定义 类中声明前带有virtual关键字的函数称为虚函数: class A { virtual void example(); } 类中申明格式如下的函数称为纯虚函数: class A { virtual void example() = 0; } 即在函数声明中含有virtual和= 0两个关键字。 区别 纯虚函数的特点: 只有声明,没有实现/定义 含有纯虚函数的类称为抽象类,抽象类不能被实例化 抽象类的派生类如果想成为具体的类(能够被实例化),则必须重写纯虚函数。

weixin_41694059的博客 1万+

C++中虚函数,纯虚函数以及多态

C++中虚函数,纯虚函数以及多态虚函数和纯虚函数虚函数纯虚函数关于构造函数和析构函数   在整理排序算法的时候想到可以借此熟悉一下类的构造以及继承等知识点,就写了一个排序基类声明一个排序函数,然后写多个排序算法的子类重写这个排序函数,过程中顺便研究了一下virtual和多态的概念。 虚函数和纯虚函数   首先回顾一下虚函数和纯虚函数的八股文,虚函数是多态的实现机制,声明一个虚函数就是在一个函数的声明(不需要定义)前加上virtual,而纯虚函数则还要函数声明后加上=0来表明纯虚函数身份,如果想要定义纯虚函数

DooDia的博客 584

C++ 虚函数与纯虚函数:多态的核心实现基石

本文深入探讨了C++中虚函数与纯虚函数的核心概念及其在多态实现中的关键作用。主要内容包括: 虚函数:通过virtual关键字声明,实现运行时动态绑定,允许派生类重写基类函数。必须保持函数签名一致,建议使用override关键字显式声明。 纯虚函数:以"=0"结尾的无实现虚函数,使类成为抽象类,强制派生类实现所有纯虚函数。抽象类不能实例化,仅定义接口规范。 底层机制:详细解析了虚函数表(vtable)和虚函数指针(vptr)的工作原理,说明动态多态的底层实现原理。 虚析构函数:强调基类应声

今天比昨天更努力一点! 1万+

<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数

在上一篇文章中,我们介绍了c++中类与对象的继承,继承可以根据一个或多个类来定义一个新的类,减少代码量,使得开发和维护一个应用程序变得更加的容易。本文将介绍c++继承的重要应用 —— 多态。

Ceylan__的博客 1678

【整理】多态、虚函数、纯虚函数

【整理】多态、虚函数、纯虚函数

qq_33310245的博客 421

多态与虚函数,纯虚函数的概念

首先,在了解什么是多态之前,要了解什么是虚函数,虚函数对于多态具有决定性的作用,有虚函数才能构成多态。怎么样创建一个含有虚函数的类呢,其实就是函数类型前面加上关键字virtual,借助虚函数,基类指针既可以使用基类的成员函数,也可以使用派生类的成员函数,它有多种形态,或多种表现方式,这就是多态。 多态是面向对象的主要特征之一。在C++中,虚函数的唯一用处就是构成多态。 C++提供多态的目的是:

Cineze的博客 2489

【C++】多态 ⑪ ( 纯虚函数和抽象类 | 纯虚函数语法 | 抽象类和实现 | 代码示例 )

一、纯虚函数和抽象类 1、纯虚函数 2、纯虚函数语法 3、抽象类和实现 二、完整代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1991

c++ 多态与纯虚函数

1、多态性 1.1多态性是面向对象程序设计的关键技术之。若程序设计语言不支持多态性,不能称为面向对象的语言。利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。 在C+ +中有中两种多态性: 编译时的多态 通过函数的重载和运算符的重载来实现的。 int Max(int a, int b) { return a > b ? a : b; } char Max(char a, char b) { return a > b ? a : b; } double Max(double

qq_46615150的博客 560

C++虚函数多态和纯虚函数多态的经典用法

此处为取得半径函数,只有圆形才有半径,方形是没有半径的,在这里基类Shape实现了getRadius()的虚函数,只不过Shape只是返回了0,因为基类不清楚怎么做,Circle子类重写了虚函数getRadius()的具体实现,如果用户输入1则创建Circle子类对象,因此在这里调用了Circle子类的重写函数,如果用户输入2则创建Square子类对象,Square子类没有重写基类虚函数getRadius(),因此在这里调用了基类Shape的虚函数getRadius()。

咸鱼爱幻想的博客 596
上一篇: C++中的const
下一篇: VC中错误解释
sooolo
博客等级 码龄17年 95粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值