C++在继承中虚函数、纯虚函数、普通函数详解

C++之继承,菱形继承,虚继承,虚函数,纯虚函数 继承,访问限定 概念:当一个类被其他的类继承时,被继承的类称为基类,又称父类;继承其他的类叫做派生类,又称子类。基类定义了所有派生类的共有属性,派生类在继承共有属性的同时,又增加了自己特有的属性。 注意:一个类可以有多个子类,一个子类也可以有多个父类,甚至子类也可以变为父类,被其他类进行继承。这就属于多继承。 作用:继承是为了复用。共享公有的东西,同时又可以实现自身独有的特征。 <继承方式... 阅读详情

1.虚函数(impure virtual)

  C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。

  子类可以重写父类的虚函数实现子类的特殊化。

  如下就是一个父类中的虚函数:

复制代码
class A
{
public:
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};
复制代码

2.纯虚函数(pure virtual)

  C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。

  C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。

  C++中的纯虚函数也是一种“运行时多态”。

  如下面的类包含纯虚函数,就是“抽象类”:

复制代码
class A
{
public:
    virtual void out1(string s)=0;
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};
复制代码

3.普通函数(no-virtual)

  普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。

  普通函数是父类为子类提供的“强制实现”。

  因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

4.程序综合实例

复制代码
#include <iostream>
using namespace std;

class A
{
public:
    virtual void out1()=0;  ///由子类实现
    virtual ~A(){};
    virtual void out2() ///默认实现
    {
        cout<<"A(out2)"<<endl;
    }
    void out3() ///强制实现
    {
        cout<<"A(out3)"<<endl;
    }
};

class B:public A
{
public:
    virtual ~B(){};
    void out1()
    {
        cout<<"B(out1)"<<endl;
    }
    void out2()
    {
        cout<<"B(out2)"<<endl;
    }
    void out3()
    {
        cout<<"B(out3)"<<endl;
    }
};

int main()
{
    A *ab=new B;
    ab->out1();
    ab->out2();
    ab->out3();
    cout<<"************************"<<endl;
    B *bb=new B;
    bb->out1();
    bb->out2();
    bb->out3();

    delete ab;
    delete bb;
    return 0;
}
复制代码

执行结果:

虚函数和纯虚函数的区别 1.1 什么是虚函数:被virtual关键字修饰的成员函数,就是虚函数。1.2 虚函数的作用:是实现多态性,多态性是将接口与实现进行分离。定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。假设我们有下面的类层次: 这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓"推迟联 阅读详情

相关推荐

C++继承中的普通函数,纯虚函数、虚函数

C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别 1.普通函数(no-virtual) 普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。 普通函数是父类为子类提供的“强制实现”。 因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。 2.纯虚函数(pure virtual) C++中包含纯虚函数的类,被称为是...

希望我的博客,能帮上你解决学习中工作中所遇到的问题 637

C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

1.虚函数(impure virtual)   C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。   子类可以重写父类的虚函数实现子类的特殊化。   如下就是一个父类中的虚函数: class A { public: virtual void out2(string s) { cout&lt;&lt;"A...

weixin_34191734的博客 455

LEAP模型—低排放分析平台

LEAP 正在迅速成为进行综合资源规划、温室气体 (GHG) 缓解评估和低排放发展战略 (LEDS) 的国家的事实标准,尤其是在发展中国家,许多国家也选择使用 LEAP 作为其承诺的一部分向联合国气候变化框架公约(UNFCCC)报告。至少有 32 个国家使用 LEAP 来创建能源和排放情景,这些情景是其国家自主气候变化贡献计划 (INDC) 的基础:具有历史意义的巴黎气候协议的基础旨在表明各国开始经济脱碳的意图和投资于气候适应力。

weixin_54697010的博客 3281

C++中虚函数与普通函数区别

1.虚函数(impure virtual)   C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。   子类可以重写父类的虚函数实现子类的特殊化。 2.普通函数(no-virtual)   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的静态类型对象,调用自己的普通函数。   普通函数是父类为子类提供的“强制实

xiaobai_chen的专栏 3275

利用wolcmd.exe批处理执行远程唤醒

代码如下: @echo off cls :check if exist wolcmd.exe goto targetmac echo 缺少wolcmd.exe echo. goto end :targetmac cls echo -------------------------------------------------------- echo 目标主机PC-01地址:40235678A...

Chriseo的博客 6949

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 269

C++ 继承之Override

C++继承之Override1.共有继承1.1纯虚函数1.2普通虚函数1.2.1 方法一1.2.2方法二1.3非虚函数2.重写(override)3.小结 1.共有继承 公有继承包含两部分:一是 “函数接口” (interface),二是 “函数实现” (implementation) 如 Shape 类中,三个成员函数,表示三种继承方式: class Shape { public: vi...

language_zcx的博客 2240

Qt | linux+openCV+Qt6.5.3环境搭建成功版(带例子)

opencv安装 Qt 实战举例

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1885

虚函数 纯虚函数 普通函数的区别

1.虚函数(impure virtual)   C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。   子类可以重写父类的虚函数实现子类的特殊化。   如下就是一个父类中的虚函数: class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } }; 2.纯虚函数(pure virtu

王者生辉的博客 4048

在树莓派4B上基于NCNN框架部署YOLOv8的实战教程

摘要:本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的完整流程。从PyTorch模型转换为NCNN格式,到树莓派环境配置(OpenCV和NCNN编译),再到C++代码实现与优化,涵盖模型加载、推理和绘图等核心功能。测试结果显示,树莓派4B上可实现约2 FPS的检测速度,Windows平台达6~7 FPS。文章还提供了量化模型、多线程优化等实用建议,并附常见问题解答,为边缘设备部署轻量化目标检测提供了可行方案。(149字)

m0_64661770的博客 596

芒果YOLOv8改进160:姿态估计Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

芒果YOLOv8改进159:OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 812

关于C++纯虚函数继承的注意事项

关于C++子类继承父类纯虚函数的注意事项欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 虚函数在继承时,编译前要先实现,否则会报错。 菜鸟学习记录: 今天学习C++的虚函数的继承等 , 在写完

qq_45809384的博客 3652

小梅哥Xilinx ZYNQ学习笔记2——38译码器

译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。本设计的是通用译码器。三八译码器,即是 3 种输入状态翻译成 8 种输出状态。1.case开始开始,endcase结束;2.数字声明时,合法的基数格式有 4 中,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。数值可指明位宽,也可不指明位宽。

m0_51430584的博客 1636

C++中虚函数和纯虚函数的区别

C++面向对象程序设计有三大思想:抽象、继承、多态

JunJie的个人博客 1万+

48-OpenCVSharp —-Cv2.MatchTemplate() 函数功能(模板匹配)详解

是 OpenCV 中一个常见且简单的模板匹配算法,适用于目标检测和图像识别中的静态场景。它的优点是易于理解和实现,但在面对旋转、尺度变化、复杂背景或光照变化等挑战时,效果可能大打折扣。在这些情况下,结合多尺度图像、特征匹配算法(如 SIFT、SURF、ORB 等)以及深度学习模型可以显著提高匹配的鲁棒性和精度。模板匹配仍然是一个非常基础但强大的工具,适用于一些简单的图像匹配任务。对于更加复杂和动态的图像识别任务,我们通常会使用其他更加复杂的算法或者深度学习模型来处理。

weixin_45590420的博客 4523

廖雪峰Python教程[完整版]

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

C++继承和多态(虚函数、纯虚函数、虚继承)

C++继承和多态(虚函数、纯虚函数、虚继承) 一:继承 继承的概念:为了代码的复用,保留基类的原始结构,并添加派生类的新成员。 继承的本质:代码复用 我们用下图解释下: 那么我们这里就可以提出几个问题了: ①:进程的方式有哪些呢? 这里有三种继承方式: public:任意位置可以访问 protected:只允许本类类中以及子类类中访问 private:只允许...

IT_Quanwudi的博客 9059

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++纯虚函数

在成员函数的形参后面写上=0,则成员函数为纯虚函数。纯虚函数声明: virtual 函数类型 函数名 (参数表列) = 0;class Person { virtual void Display () = 0; // 纯虚函数 protected : string _name ; // 姓名 }; class Student : public Person {};

xy的博客 4万+

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++编程法则365天一天一条(358)论公有继承时纯虚函数、虚函数、普通函数的行为表现及虚函数的重写(深度好文)

文章目录1 公有继承时三种类型的函数行为1.1 纯虚函数 (pure virtual)1.2 普通虚函数**1.2.1 方法一****1.2.2 方法二**1.3 非虚函数2 重写 (override)小结 1 公有继承时三种类型的函数行为 公有继承包含两部分:一是 “函数接口” (interface),二是 “函数实现” (implementation)。为何这里只谈公有继承,因为私有继承没办法被继承啊,而保护继承虽然说可以,但是类外无法访问啊,所以只有公有继承可以实现接口继承。 如 Shape 类中,

二进制君 1万+

C++ 虚函数和纯虚函数

虚函数和纯虚函数的区别 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义它为虚函数是 为了允许用基类的指针来调用子类的这个函数 , 也就是 虚函数是指一个类中你希望重载的成员函数 ,当你用一个 基类指针或引用 指向一个子类对象的时候,调用一个虚函数时, 实际调用的是子类的版本。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。 一、虚函数 1.虚函数定义 在基类中实现虚函

qq_39779233的博客 4185

C++ 纯虚函数 虚函数 override

override在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。还有一个典型应用就是在继承中也可能会在子类覆盖父类的方法。 1.公有继承 包含两部分:一是“接口”(interface),二是 “实现” (implementation)。 class Shape { public: virtual void Draw() const = 0;

软件工程小施同学 的专栏 3894

C++ 纯虚函数

虚函数 在基类中将一个函数声明为虚函数,使该函数具有虚属性,那么其所有派生函数中该函数的重写都具备了虚属性,也就使得基类指针可以调用派生类实例中继承自该基类的所有成员函数,且若有重写,调用的都是重写后的函数。 纯虚函数 声明纯虚函数可使当前类变成抽象类,禁止该类被实例化,并要求其非抽象类的派生类必须实现该函数。 下面展示虚函数和纯虚函数的代码示例,注意观察注释内容: class Ba...

qq_38755753的博客 5077

C++中虚函数和纯虚函数的问题总结

目录 C++中虚函数和纯虚函数的问题总结 虚函数 虚函数的定义 虚函数的目的 纯虚函数 纯虚函数的定义 纯虚函数的特点 虚函数相关问题 问题一:基类的虚函数表存放在内存的什么位置,虚表指针vptr的初始化时间 问题二:虚函数能否声明为内联函数? 问题三:构造函数为什么不能为虚函数?析构函数为什么要虚函数? 问题四:构造函数和析构函数可以调用虚函数吗? 问题五:静态成员函数static能定义为虚函数吗?常成员函数const呢? 问题六:哪些函数不能是虚函数? C++.

weixin_44477424的博客 2041

C++虚函数与纯虚函数使用详解

虚函数 纯虚函数 虚函数其实本身就是,面向对象语言的一种行为抽象,从设计模式角度出发的话,减少代码重复量,是为了提高程序扩展性的一种手段。在类中的具体实现如下: virtual void fun() = 0; //or virtual void fun() const = 0; = 0 就是向编译器表示,该函数为纯虚函数,有纯虚函数的类,则被称为抽象类,该类不能被实例化,而之后的const 关键字则表示该函数内部不能修改数据成员,第一次见这种写法,被唬住了。 ...

SUST_DOG_MASTER博客 2331

虚函数、纯虚函数和虚继承

抽象类被继承后,子类可以继续是抽象类,也可以是普通类,而虚基类,是含有纯虚函数的类,它如果被继承,那么子类就必须实现虚基类里面的所有纯虚函数,其子类不能是抽象类。实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,纯虚函数是一种特殊的虚函数,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。虚函数、纯虚函数的联系。

weixin_42650596的博客 1150

C++——虚函数/纯虚函数

在学习C++的过程中,对于虚函数的概念有一定的疑惑,因此写一篇文章帮助自己记忆和理解。提示:以下是本篇文章正文内容,下面案例可供参考实际写代码的过程中经常会出现类继承的现象。而类继承中往往又容易出现函数重写或者重定义的情况(可以理解为函数重名)。如下,此时若我们定义了一个输入类型为Entity的指针(即基类指针)的函数,而给他入的是继承类的实例,则可能无法达到我们所需要的要求。y=0;

m0_70214752的博客 2028

C++中的继承和虚函数、纯虚函数

一、继承C++中存在着继承关系,可以想象称为世袭制,哈哈这样会更有助于帮助理解,C++中的继承和我们现实中的世袭是差不多的,C++中的继承在两个或者多个类中体现的,这里我们直说两个类的,复杂的继承我们不进行讨论。我们都知道继承不能够继承父的生和死还有他的私有,继承和我们类中声明方法和成员是类似的,也有公有继承、保护继承和私有继承三种。我们分别来看看这三种属性的继承: (说明:父类的私有成员和方法只

magiclyj的博客 895
上一篇: java里的EL表达式在JSP中不能解析的问题
下一篇: JavaScript面向对象编程(对象创建)
我爱默小兜
博客等级 码龄14年 387粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值