C++知识点9:virtual虚拟函数

C++ Virtual详解 pb是基类指针,pd是派生类指针,pd的所有函数调用都只是调用自己的函数,和多态性无关,所以pd的所有函数调用的结果都输出Derived::是完全正常的;pb的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的,所以有virtual的f函数调用输出Derived::,其它两个没有virtual则还是输出Base::很正常啊,nothing surprise!在单继承下这种由继承支持的特殊形式的按值组合提供了最有效的最紧凑的对象表示。 阅读详情

虚函数:

基类中加入关键字virtual的函数
作用:在基类的派生类中可以通过重写虚函数实现对基类虚函数的覆盖。
当基类指针指向派生类对象时,指针调用的函数实际上是调用了派生类的函数。

基类函数中有virtual关键字
输出结果:derived//调用派生类函数

#include <iostream>
using namespace std;

class base
{
public:
    base(){}
    virtual void print(){cout<<"base"<<endl;}
    //void print(){cout<<"base"<<endl;}
};

class derived:public base
{
public:
    derived(){}
    void print(){cout<<"derived"<<endl;}
};
int main()
{
    base *point=new derived();
    point->print();
    return 0;
}

基类函数中没有virtual关键字
输出结果:base//调用基类函数

#include <iostream>
using namespace std;

class base
{
public:
    base(){}
    //virtual void print(){cout<<"base"<<endl;}
    void print(){cout<<"base"<<endl;}
};

class derived:public base
{
public:
    derived(){}
    void print(){cout<<"derived"<<endl;}
};
int main()
{
    base *point=new derived();
    point->print();
    return 0;
}

多态实现原理:

虚函数表指针->虚函数表->虚函数地址

类中定义一个虚函数表指针,该指针指向虚函数表,虚函数表中存储虚函数地址。
实例化一个子类对象时,会初始化虚函数指针。(指针存储在对象的内存中)
若子类没有重新定义虚函数的时候,子类从父类中继承了虚函数,所以子类的虚函数表存储和父类相同的虚函数地址。
若子类重新定义虚函数,子类的虚函数表中存储了自己定义的虚函数地址。

虚拟的析构函数:

父类指针指向子类对象,通过delete父类指针释放子类对象
基类的析构函数添加virtual关键字
作用:基类的析构函数不加virtual关键字时,撤销基类指针,不会调用派生类的析构函数而直接调用基类的析构函数,从而不会释放派生类对象构造时占用的内存,造成内存泄漏。(未调用继承类析构函数而导致内存泄露)
实现原理:
父类
子类
父类指针指向子类对象,当delete删除父类指针时,通过指向的子类对象找到子类的虚函数表指针,从而找到虚函数表,再虚函数表中找到子类的虚析构函数,从而使得子类的析构函数得以执行,子类的析构函数执行之后系统会自动执行父类的虚析构函数。

纯虚函数:

抽象类:包含纯虚函数的类是抽象类,不能实例化。纯虚函数在基类中只有声明,只能在子类中实现。
纯虚函数定义形式:

virtual <函数返回类型> <函数名>()=0;
#include<iostream>
using namespace std;

class Virtualbase

{

public:

    virtual void Demon() = 0; //prue virtual function

    virtual void Base() { cout << "this is farther class" << endl; }

};

//sub class

class SubVirtual :public Virtualbase

{

public:

    void Demon() {
        cout << " this is SubVirtual!" << endl;
    }

        void Base() {
            cout << "this is subclass Base" << endl;
        }

    };


        void main()

        {

            Virtualbase* inst = new SubVirtual(); //multstate pointer

            inst->Demon();

            inst->Base();

            // inst = new Virtualbase();

            // inst->Base()
            system("pause");

            return;

        }
从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求 本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。 阅读详情

相关推荐

视觉检测在激光打码字符检测上的检测案例

在机器视觉检测技术中,OCR识别是比较典型的应用,应用的场景也比较丰富,基本上在制造业,每个工厂或者印刷厂都会用到视觉OCR识别检测,OCR字符识别的原理很简单,通过图像分割后,对字符进行学习、命名。在工业相机拍摄图像后,软件进行处理,从而读取结果。 随着技术的发展,激光打标技术被更多的应用在生产过程中,由激光打标代替油墨进行字符印刷,速度更快、效果更好。 但是随之而来的是在视觉检测上带来的影响,目前市面上应用的字符检测设备大多是由集成商单独开发的软件,在检测油墨印刷时,图像上的字符没有断点,非常连贯,所需

视觉检测设备-视觉检测系统-单张检测设备-卷料印品检测 1460

C++ 继承

C++ 继承 继承(inheritance) 是面向对象三大特性之一,它是使代码复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称子类或派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。 目录C++ 继承继承后访问权限的变化父类和子类对象赋值继承中作用域成员函数继承与友元、静态成员多继承菱形继承解决菱形继承的方法 继承后访问权限的变化 类成员/继承方式 public继承 protected继承 private继承 父

juggte的博客 479

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2131

C++虚析构函数及delete操作分析

关键字:scalar deleting destructor、虚表 通常我们在写一个基类的时候,若基类成员变量需要动态申请内存空间或基类成员变量引用了系统资源时,需定义类的析构函数来明确在删除对象时需要释放的成员。 1. 析构函数 析构函数在析构时调用。若在堆上申请的内存,则不需要调用delete释放内存,只需要调用析构函数。 1.1 析构函数与delete 在堆上申请的内存需要delete删除对象。在删除对象时既要执行析构又要释放内存。 class A { public: ~A(){} }; int m

David 7980

解决WSL2网络隔离:Ubuntu子系统共享Windows代理的3种方法

本文详细解析了WSL2的网络隔离特性,并提供了三种在Ubuntu子系统中共享Windows代理的实用方法:环境变量法、配置文件法和系统服务法。通过具体代码示例和方案对比,帮助开发者快速解决WSL2网络访问问题,实现一键设置代理,提升开发效率。

weixin_29295541的博客 450

LauterBach使用教程

(也就是服务器上编译时候的路径一模一样的路径,选中到工程目录就可以)4.选择自己板子对应的cpu(可以直接界面选择也可以命令行的方式)(cpu里的system setting),我们板子需要sys复位,所以选择sys。注:一般情况下运行状态不可以修改外设寄存器的值,但是可以通过修改配置来修改为运行时可修改(cpu寄存器则不可以)(修改这个配置,运行时也可以查看代码)注意:lauterbach可以使用命令来操作,但是由于本人刚刚使用,目前基本上使用的都是界面的按钮,以后会陆续学习命令行指令和脚本的方式。

wacebb的博客 1万+

C++——虚函数

析构函数声明为虚函数 #include <iostream> using namespace std; class Base{ public: Base(); virtual ~Base();//声明为virtual,保证调用子类的析构函数,释放内存空间 protected: char *str; }; Base::Base(){ str = new char[100]; cout<<"Base contructor"<<endl; } Base::~Ba

weixin_43293451的博客 276

Ubuntu新手必看:3种方法快速查看和编辑JSON文件(附jq安装指南)

本文为Ubuntu新手详细介绍了三种查看和编辑JSON文件的核心方法:命令行利器jq、灵活脚本Python以及直观的图形化编辑器(如VS Code)。文章重点解析了jq的安装与核心用法,并对比了各方案的优缺点,帮助用户根据快速查询、复杂处理或直观编辑等不同场景,选择最合适的工具,从而高效处理JSON数据。

weixin_29229989的博客 415

虚函数(virtual)

虚函数(virtual) 上面提到动态多态主要通过虚函数机制实现,这里介绍以下虚函数。和普通的函数声明方式相同,只要在函数的返回值前加上virtual关键字,该函数就为虚函数,即virtual 函数类型 函数名(形式参数) 虚函数的作用:允许通过基类的指针或引用来访问基类和派生类的同名函数。 1、虚成员函数 #include <iostream> using namespac...

qq_37200329的博客 4600

智元机器人开源具身仿真框架 Genie Sim 入门教程

GenieSim是AgiBot推出的具身智能仿真框架,提供完整闭环开发管道,包括轨迹生成、模型训练和基准测试。框架支持Docker容器化部署,要求Ubuntu 22.04和NVIDIA硬件环境。主要功能涵盖: 支持12种基准测试任务 提供ADER评估框架 集成UniVLA/RDT等基线模型 支持PICO/键盘遥操作 具备轨迹记录回放功能 提供完整API控制接口 开发者可通过Hugging Face获取场景资产,使用标准化ROS主题与仿真环境交互。框架特别优化了碰撞检测和抓取物理模拟,适用于从简单抓取到复杂操

2506_90492529的博客 2535

工业质检封神!YOLOv8实战金属表面缺陷检测,自建数据集mAP突破95%

本文详细介绍了基于YOLOv8的金属表面缺陷检测实战方案。针对工业质检中的光照不均、纹理复杂、小样本等挑战,作者构建了12000张图像的数据集,提出针对性数据增强策略和两阶段训练方法。通过优化损失函数、调整超参数等技术手段,最终在测试集上达到95.1%的mAP@0.5,检测速度32FPS。相比传统方法,该方案在精度和鲁棒性上均有显著提升,为工业视觉质检提供了可复现的落地解决方案。

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

C++温习面向对象——3、继承

写在前面 C++面向对象的思想,之前总结到,主要包括封装、 继承的基本概念 1、一个类A可以继承另一个类B,那么我们称类B为基类(父类),类A为派生类(子类)。 2、子类从父类继承了所有成员,除了构造函数、析构函数、赋值运算符重载函数。(还是要自己构造自己和“自杀”滴)。 3、子类的成员分为两部分: 继承,扩展 4、虽然父类的私有成员被子类继承,但子类不能直接访问父类的私有成员。(朋友可以用,儿子不可以哈哈哈,可以结合之前的友元类)可以通过继承自父类的公有成员函数来访问。 5、子类可以自己实现与父类成员函数

RiddleC的博客 798

MATLAB离线附加功能包下载与安装教程

本文介绍如何下载与安装MATLAB离线附加功能包,便于大家更加高效的使用MATLAB。

加斯顿工程师的博客 1万+

《 C++ 点滴漫谈: 十三 》C++ 中的虚拟函数革命:virtual、override 和 final 如何改变你的代码

这篇博客深入探讨了 C++ 中 virtual、override 和 final 关键字的核心概念与使用技巧。我们从虚函数和多态的基本概念出发,讲解了如何通过 virtual 实现动态绑定,使程序能够在运行时根据对象类型调用适当的函数。接着,我们深入分析了 override 的使用,帮助开发者避免重写错误,并确保代码的正确性。同时,我们还探讨了 final 关键字,阐明了它在继承和函数重写中的重要作用。通过案例分析,我们讨论了虚函数在多继承、性能优化等方面的复杂性,并结合 C++11 及以后的增强特性,提供

Lenyiin 2490

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

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

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

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

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

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

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++的virtual和override作用

一、概述 c++的virtual提供了运行时的多态,是的可以用基类的指针调用子类对象的函数,通过override可以强制要求基类有对应的虚函数。 二、测试代码 #pragma once #include <stdio.h> class Base { public: void A_1() { printf("Base::A_1\n"); }; virtual void A...

游戏猫的博客 6954

C++ 虚拟析构函数 (virtual destructor)

C++ 虚拟析构函数 (virtual destructor). 虚拟析构函数的用法以及使用场景.

我是小白呀的博客 7873

虚拟函数表(Virtual Table)

 1.          虚拟函数表其实就是一个存放指针的指针数组,它里面有一个或者是多个指针,而每一个指针都指向一个虚函数,通过它可以知道虚函数的地址。2.          一个类或是接口,如果声明有虚函数,那么它们就会带有VirtualTable,而它们实例化的Object也会相应的含有一个vptr(一个指向Virtual Table的指针,位于Object的开始位置),用于类对

105694832的专栏 3097

c++ virtual 关键字的解释

@C++面向对象之virtual(转载) 转载原文地址:https://www.codeleading.com/article/78745066604/ 先从virtual说起 面向对象的三大特征,封装,继承,多态。说到多态,就绕不开virtual。C++的多态又如此的不一样,它分为静态绑定和动态绑定,其中有一个非常重要的关键字,它就是virtual. C++中的virtual关键字修饰方法 约等于 Java中abstract关键字修饰方法。 virtual,望文生义。虚拟的意思。它是用来修饰一个方法的,当

Richgui的博客 1667

C++中的虚析构函数

Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到。即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的目的,从而防止内存泄漏。 2.C++中开发中,基类中的析构函数一般都是虚函数,如下面的例子: #include <iostream> using namespace st...

CurryCoder的个人博客 1万+

C++中的virtual函数(虚函数)

在上周的C++课中,我第一次接触到虚函数(virtual function)这个非常重要的概念 什么是virtual函数? 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行

An_dy_code的博客 3100

c++ virtual和函数重载的些许区别

Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在 Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是B

zailushang530839037的专栏 1307

修饰构造函数的explicit与修饰析构函数的virtual

例如作为其他类的透明包装器的类。首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).上面也已经说过了, explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。多态的定义:一种接口有多种形态,所以重载也是一种多态哦!

qq_57023986的博客 1369

c++ private、protect、public、virtual详细说明***

今天遇到有些同事居然对这些关键字的权限等还不是特别了解,容易弄混淆,今天总结下。 private: 私有控制符。这类成员只能被本类中的成员函数和类的友元函数访问。 protected: 受保护控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可以被派生类的成员函数和派生类的友元函数访问。 public: 共有控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可...

随意的风的专栏 6997

C++对象模型——Virtual Member Functions (虚拟成员函数)(第四章)

4.2 Virtual Member Functions (虚拟成员函数) 已经看过了 virtual function的一般实现模型:每一个 class 有一个 virtual table,内含该 class 中有作用的 virtual function的地址,然后每个object有一个vptr,指向 virtual table的所在. 为了支持 virtual function机制,必须首

yiranant的专栏 1688
上一篇: 面试题32:从上往下打印二叉树
下一篇: C++知识点10:构造函数和析构函数
有多少个小土豆
博客等级 码龄10年 235粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值