首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果我初始化一个非0的虚函数,会发生什么?它是否会创建一个纯虚拟函数,或者在内存中还会发生什么?

如果初始化一个非0的虚函数,会发生以下情况:

  1. 创建一个非纯虚函数:虚函数是通过在基类中声明为虚函数来实现的,如果在初始化时给虚函数赋予非0的值,那么它将被视为一个非纯虚函数。非纯虚函数是有实现代码的虚函数,子类可以直接继承或重写该函数。
  2. 内存中不会发生特殊变化:虚函数表(vtable)是用于实现多态的机制,它存储了虚函数的地址。初始化一个非0的虚函数不会对虚函数表或内存中的其他部分产生直接影响。虚函数表的构建是在编译时完成的,不会因为初始化虚函数的值而改变。

总结: 初始化一个非0的虚函数会创建一个非纯虚函数,但不会对内存中的虚函数表或其他部分产生直接影响。虚函数表的构建是在编译时完成的,与虚函数的初始化值无关。

腾讯云相关产品和产品介绍链接地址: 腾讯云产品提供了丰富的云计算服务,包括云服务器、云数据库、云存储等。您可以访问腾讯云官网了解更多详情:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《逆袭进大厂》第三弹之C++提高篇79问79答

所有其他的非静态数据成员都不会被初始化。 110、抽象基类为什么不能创建对象? 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。...3、 如果在类的析构函数中调用delete this,会发生什么? 会导致堆栈溢出。原因很简单,delete的本质是“为将被释放的内存调用一个或多个析构函数,然后,释放内存”。...,0,sizeof(*this))会发生什么 1) 有时候类里面定义了很多int,char,struct等c语言里的那些类型的变量,我习惯在构造函数中将它们初始化为0,但是一句句的写太麻烦,所以直接就...纯虚函数只是相当于一个接口名,但含有纯虚函数的类不能够实例化。 纯虚函数首先是虚函数,其次它没有函数体,取而代之的是用“=0”。...既然是虚函数,它的函数指针会被存在虚函数表中,由于纯虚函数并没有具体的函数体,因此它在虚函数表中的值就为0,而具有函数体的虚函数则是函数的具体地址。 一个类中如果有纯虚函数的话,称其为抽象类。

2.2K30

【C++】多态

final也可以修饰虚函数,表示该虚函数不能被重写,这个语法其实就比较奇怪了,设计虚函数的意义就是为了让他在派生类里面发生重写,从而通过基类指针或引用完成多态调用,一个虚函数如果不能被重写,自然虚函数也就没什么意义了...override用于检测虚函数是否重写,如果并未重写则会发生报错,比如有的时候我们在重写虚函数时,不小心多加了个参数,或者函数名少写了一个字母等等,就会导致虚函数未完成重写的工作,此时override就会编译报错...如果一个虚函数在接口后面加上=0,则这个虚函数为纯虚函数,纯虚函数所在的类为抽象类,抽象类是不可以被实例化出对象的,如果抽象类被继承,派生类里面天然的就会有纯虚函数,那么派生类也就变成了抽象类,一个类如果连对象都实例化不出来...当一个类里面出现虚函数时,这个类实例化出的对象模型就会发生改变,他的类成员除变量之外,还会多一个虚表指针,这个虚表指针指向一个数组,这个数组里面存放的是类里面虚函数的地址。...一般来说,虚基类成员都放在逻辑对象模型中成员的最下面,如果是在内存里面的话,他的位置应该是对象成员中的最高地址处。 11.什么是抽象类?抽象类的作用?

55220
  • 面经:C++面试精品问答题总结(一)

    ,小则一个小Bug,重则一个大型的车祸现象,我们平时一定要对转型的行为进行重点关注,每次转型的时候必须要明白这个转型是否正确,当然平时我们如果使用比较好的IDE(例如CLion)进行编写代码的时候,其静态代码分析工具会帮你找到转型可能会发生的问题...在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion1()=0 引入原因 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。...同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。...所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。...(3)使用抽象类时注意: 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。

    53151

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    ,而它拥有一组参数时; 2) 成员初始化列表做了什么 ① 编译器会一一操作初始化列表,以适当的顺序在构造函数之内安插初始化操作,并且在任何显示用户代码之前; ② list中的项目顺序是由类中的成员声明顺序决定的...由于对象成员变量的初始化动作发生在进入构造函数之前,对于内置类型没什么影响,但如果有些成员是类,那么在进入构造函数之前,会先调用一次默认构造函数,进入构造函数后所做的事其实是一次赋值操作(对象已存在),...,因此使用delete关键字可以更加人性化的删除一些默认方法 =0 将虚函数定义为纯虚函数(纯虚函数无需定义,= 0只能出现在类内部虚函数的声明语句处;当然,也可以为纯虚函数提供定义,不过函数体必须定义在类的外部...虚拟继承基类的子类中,子类会增加某种形式的指针,或者指向虚基类子对象,或者指向一个相关的表格;表格中存放的不是虚基类子对象的地址,就是其偏移量,此类指针被称为bptr,如上图所示。...引用在创建的时候必须初始化,在访问虚函数时,编译器会根据其所绑定的对象类型决定要调用哪个函数。注意只能调用虚函数。

    2.4K40

    字节客户端也疯狂拷打基础!

    push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素); 而emplace_back() 在实现时,则是直接在容器尾部创建这个元素...在C++中,纯虚函数的声明形式如下: virtual void function() = 0; 其中,= 0就表示这是一个纯虚函数。 含有纯虚函数的类被称为抽象类。...派生类必须实现所有的纯虚函数,否则该派生类也会变成抽象类。 纯虚函数的应用场景主要包括: 设计模式:例如在模板方法模式中,基类定义一个算法的骨架,而将一些步骤延迟到子类中。...这些需要在子类中实现的步骤就可以声明为纯虚函数。 接口定义:可以创建一个只包含纯虚函数的抽象类作为接口。所有实现该接口的类都必须提供这些函数的实现。 为什么一般将析构函数设置为虚函数?...如果我们有一个基类指针,它实际上指向一个派生类对象,当我们删除这个基类指针时,如果析构函数不是虚函数,那么就只会调用基类的析构函数,而不会调用派生类的析构函数。

    29530

    计算机考研复试C语言常见面试题「建议收藏」

    +模板 4 10、内存泄漏 5 11、智能指针 6 12、野指针 7 13、new与malloc的区别 7 14、堆栈区 7 15、虚函数与纯虚函数 8 16、为什么析构函数必须是虚函数?...保持变量内容持久 如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域不会发生改变,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。...return 0; } 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...在基类中实现纯虚函数的方法是在函数原型后加“=0” 如:virtual void funtion1()=0 如果A中的virtual去掉以后,以上的结果将会是A的foo 16、为什么析构函数必须是虚函数...ID; (2)fork向新创建的子进程返回0,以告知它已经被成功创建; (3)如果出现错误,fork返回一个负值; 创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,

    1.6K30

    轻松搞定面试中的“虚”

    包括:虚函数,纯虚函数,虚基类,虚继承... 1.什么是虚函数,有什么作用? 在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。...纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个虚函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。...(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?) 6.是否可以在析构函数或者构造函数中调用虚函数? 在构造函数不要调用虚函数。...显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以...为实现动态联编,编译器为每个包含虚函数的类创建一个表,称为vtable,在vtable中,编译器放置了特定类的虚函数地址,在每个带有虚函数的类中编译器会秘密地设置一个虚函数表指针,称为vptr,指向对象的

    68120

    C++:深入理解多态

    , 2.4 重载、覆盖(重写)、隐藏(重定义)的对比 三、抽象类 3.1 什么是抽象类 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。...纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。 在生活中一个类型在现实中没有对应的实体,我们就可以一个类定义为抽象类!...} 从上的分析我们可以总结出: 1、虚函数表(简称虚表)本质上是一个虚函数指针数组 2、子类在创建对象的时候会拷贝父类的虚函数表,然后如果没有发生重写(比如Func()) 那虚函数表存的就是父类的虚函数...在C++中,常常通过声明顺序来代表实际顺序,比如说 1、初始化列表的初始化顺序取决于成员变量定义的先后顺序 2、一个子类继承多个父类的时候,内存中先继承的父类的成员变量在前面,后继承的父类的成员变量再后面...——>编译阶段 一个类是否存在虚表关键就在于是否有虚函数,而是否有虚函数取决于是否有virtual关键字,所以是在编译阶段生成。 2、对象中的虚表指针是什么时候初始化的??

    9400

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    6、基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间 首先整理一下虚函数表的特征: 虚函数表是全局共享的元素,即全局仅有一个,在编译时就构造完成 虚函数表类似一个数组,类对象中存储vptr...析构函数可以是纯虚函数,含有纯虚函数的类是抽象类,此时不能被实例化。但派生类中可以根据自身需求重新改写基类中的纯虚函数。 构造函数: 构造函数不能定义为虚函数。...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时...如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收 自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的 全局/静态存储区:全局变量和静态变量被分配到同一块内存中

    2.6K40

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。...结果是编译器并不会报错,因为它并不知道你的目的是重写虚函数,而是把它当成了新的函数。 如果这个虚函数很重要的话,那就会对整个程序不利。...不过,有的编译器在free时并没有清理堆中的内存,有时你对它free两次也不一定出错。不过这是一个很大的隐患,在实际写代码中千万要注意避开这点。 33、浅拷贝是什么?深拷贝是什么?...volatile 关键字告诉编译器该关键字修饰的变量是随时可能发生变化的。 每次使用它的时候必须从内存中取出它的值,因而编译器生成的汇编代码会重新从它的地址处读取数据放在左值中。...如果该变量是一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就容易出错,所以说volatile 可以保证对特殊地址的稳定访问。 37、为什么析构函数一般写成虚函数?

    2.2K20

    《逆袭进大厂》之C++篇49问49答

    6、基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间 首先整理一下虚函数表的特征: 虚函数表是全局共享的元素,即全局仅有一个,在编译时就构造完成 虚函数表类似一个数组,类对象中存储vptr...析构函数可以是纯虚函数,含有纯虚函数的类是抽象类,此时不能被实例化。但派生类中可以根据自身需求重新改写基类中的纯虚函数。 构造函数: 构造函数不能定义为虚函数。...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时...如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收 自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的 全局/静态存储区:全局变量和静态变量被分配到同一块内存中

    2K10

    硬核 | C++ 基础大全

    如果没有显示的写拷贝构造函数,则系统会默认创建一个拷贝构造函数,但当类中有指针成员时,最好不要使用编译器提供的默认的拷贝构造函数,最好自己定义并且在函数中执行深拷贝。...动态多态的实现与虚函数表,虚函数指针相关。 扩展: 子类是否要重写父类的虚函数?子类继承父类时, 父类的纯虚函数必须重写,否则子类也是一个虚类不可实例化。...,也称为某个基类为派生类的主基类 查看派生类中是否有重写基类中的虚函数, 如果有,就替换成已经重写的虚函数地址;查看派生类是否有自身的虚函数,如果有,就追加自身的虚函数到自身的虚函数表中。...如何检测内存泄漏 首先可以通过观察猜测是否可能发生内存泄漏,Linux 中使用 swap 命令观察还有多少可用的交换空间,在一两分钟内键入该命令三到四次,看看可用的交换区是否在减少。...哪些函数不能是虚函数 构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针在构造函数中初始化; 内联函数,内联函数表示在编译阶段进行函数体的替换操作

    1.2K10

    c++类和继承面试点25连问

    构造函数里面”初始化列表”和”赋值”的区别 初始化列表和赋值的区别如下: 初始化列表只会调用一次构造函数,其实就是变量声明时初始化; 赋值会先调用构造函数,再调用一次赋值函数,它相当于在声明后,又进行了赋值...友元类是什么 与友元函数类似,在一个类A中声明另外一个类B为friend类型,那么这个类B就是友元类,它访问类A的私有成员和保护成员都不受限制。...由成员变量和是否有虚函数决定,如果类中有虚函数,那就在所有成员变量的基础上加上一个虚函数指针的大小,在64位机器中,虚函数指针为8个字节,注意计算类大小的时候要考虑字节对齐的问题。...22. new一个类的时候发生了什么 new其实就是申请动态内存,而一个类只有虚指针和成员变量才需要内存,所以new一个类就是给虚指针和成员变量申请内存空间。 23. 类的成员函数有地址吗?...print就是纯虚函数,所谓纯虚函数其实就是虚函数后面加= 0,此时print函数是不需要实现的,它只是定义了一个抽象接口而已。

    99410

    【c++】全面理解C++多态:虚函数表深度剖析与实践应用

    } 当我们通过基类的指针来删除一个派生类的对象时,如果基类的析构函数没有被声明为虚拟的(virtual),将会发生对象的不完全析构。...隐藏也是在类的继承关系中发生,但它和是否为虚函数无关。...调用就可以看出存的是哪个函数 函数写好后,关键是我如何取到它的地址?...基类中的虚函数定义了一个接口,而派生类通过覆盖这个虚函数,提供了这个接口的特定实现 当创建了派生类 B 的实例,并通过它调用 test() 时,过程如下: test() 是在基类 A 中定义的,因此它会调用...} 当创建一个派生类的对象时,构造函数会按照特定的顺序执行,确保所有的基类和成员变量都被正确初始化。

    33800

    【C++】42道面试经典问题总结

    分开原因:当我们去初始化一个容器时,底层应该是空的,只有内存,没有对象,但是如 果在容器构造时直接用new,不仅会开辟内存还会构造很多无用的对象 。...派生类的初始化过程是:基类构造然后是派生类构造。所以可以把基类的构造函数私有化 什么是纯虚函数?为什么要有纯虚函数?虚函数表放在哪里?...基类不代表任务实体·,它的主要作用之一就是给所有的派生类保留统一的纯虚函数接口,让派生类进行重写方便多态机制使用。因为基类不需要实例化,它的方法也就不知怎么去实现。...一个类如果有虚函数,那么在编译阶段就要产生一张虚函数表,在运行的时候加载到.rodata段 用指针或者引用时,来调用虚函数时,通过指针访问对象的头四个字节·vfptr去相应的vftable中取虚函数的地址进行动态绑定调用...会发生什么? 虚函数的调用前提是对象存在, 一个派生类的构造要先调用基类构造函数,如果基类是虚构造函数则会无限循环 在构造函数中,是不会进行动态绑定的,虚构造函数本身也不能实现成虚函数。

    11610

    C++相关基础知识总结笔记

    静态成员变量是否可以在构造函数中初始化? 不可以。静态成员变量在构造函数之前就已经初始化了。构造函数用于初始化对象的非静态成员变量,而静态成员变量在类的所有对象创建之前就已经存在。...C++什么情况下迭代器会失效? 在 C++ 中,迭代器失效通常发生在容器的状态发生改变,导致迭代器不再指向有效的元素或者其指向的元素的位置发生了变化。 以下是一些常见的迭代器失效的情况: 1....如果基类没有默认构造函数,或者需要传递参数给基类构造函数,可以在派生类的构造函数初始化列表中显式调用基类的构造函数。 构造函数的规则 如果类中定义了任何构造函数,编译器就不会自动生成默认构造函数。...虚函数和纯虚函数 虚函数是一种成员函数,它允许基类指针或引用来调用派生类中的对应函数,从而实现多态性。 特点: 多态性:通过基类指针或引用调用虚函数时,会调用派生类中重写的函数(如果有的话)。...如果继承多个类,就会生成多个虚表 是否存在多个虚表指针的情况 在 C++ 中,通常一个对象只有一个虚表指针(vptr)。

    21330

    看完这篇文章,解决 APP 中 90 % 的内存异常问题

    不同引用类型的回收状态 强引用 Object strongReference = new Object() 如果一个对象具有强引用,那垃圾回收器绝不会回收它,当内存空间不足, Java 虚拟机宁愿抛出...软引用 (SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存,只要垃圾回收器没有回收它,该对象就可以被程序使用。...在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。...Activity 组件泄漏 非业务需要不要把 activity 的上下文做参数传递,可以传递 application 的上下文 非静态内部类和匿名内部内会持有 activity 引用(静态内部类 或者

    76730

    大疆嵌入式一面问题集合

    如涉及公司条例,可联系我删除,答案是自己整理的,答案不一定正确,欢迎指正自我介绍(包括项目介绍)怎么判断栈溢出答:栈溢出发生的时候,栈顶指针(SP - Stack Pointer)一定会超出栈的范围,所以也可以在发生线程切换的时候...14.MMU是什么东西?MMU是如何实现虚拟内存和实际物理内存的切换的答:内存管理单元。MMU的主要作用:虚拟地址到物理地址的转换。具体的过于复杂。...重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性。虚函数和纯虚函数:定义一个函数为虚函数,不代表函数为不被实现的函数。...定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。...,分配给其他进程去执行;(2)进程在规定的最大运行时间段中运行过程中,发生阻塞或异常结束,cpu马上就会切换到其他进程去执行;(1)时间片设置过短:由于设置过短,分配到每个进程的时间也会很短,因此会在多个进程中进行频繁的切换

    1.1K31

    C++面试题

    纯虚函数和虚函数表 如果类中存在虚函数,那么该类的大小就会多4个字节,然而这4个字节就是一个指针的大小,这个指针指向虚函数表,这个指针将被放置与类所有成员之前。...虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。...当一个构造函数被调用时,它做的首要的事情之一是初始化它的VPTR。因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。...而析构函数同样也是成员函数,虚析构函数也会进入虚表,唯一不同的是,函数名并不要求一致,而且,你如果不写,编译器也会帮你生成,而且如果基类有virtual,编译器也会默认给子类添加。...2) 在初始化过程中,会先推断待初始化的元素类型是否为内置类型,若为内置类型POD(Plain Old Data),则直接调用更加底层的函数,上面三个函数相应的底层函数分别为:memmove(b1,b,

    1.7K42

    C++ 类使用规范建议

    类是 C++ 基本的代码单元,被广泛使用。本节列举了在写一个类时要做什么、不要做什么。 1....定义:在构造函数中执行初始化操作。 优点:排版方便,无需担心类是否初始化。...定义:当一个类满足以下要求时,称之为纯接口: (1)只有纯虚函数("=0")和静态函数(下文提到的析构函数除外); (2)没有非静态数据成员; (3) 没有定义任何构造函数。...但是由于m_engine必须绑定到一个现存的CEngine对象上,也就是说,在实际应用中,构造CCar之前,我们必须保证合法的CEngine对象的存在,不管后来是否用到它。...首先,在构造时,可以将m_pEngine置为NULL。在需要使用m_pEngine的时候,判断其是否为NULL。如果是,则创建一个新的CEngine对象。这就满足了我们按需创建的要求(惰性原则)。

    1.8K20
    领券