首页
学习
活动
专区
工具
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.什么是抽象类?抽象类作用?

50020

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

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

29051

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

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

2.2K40

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

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

23630

计算机考研复试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 如果Avirtual去掉以后,以上结果将会是Afoo 16、为什么析构函数必须是函数...ID; (2)fork向新创建子进程返回0,以告知已经被成功创建; (3)如果出现错误,fork返回一个负值; 创建新进程成功后,系统中出现两个基本完全相同进程,这两个进程执行没有固定先后顺序,

1.5K30

轻松搞定面试

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

65120

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

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

1.8K20

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

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

2.5K40

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

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

1.9K10

硬核 | C++ 基础大全

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

1.1K10

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

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

88910

【C++】多态

< "买票-全价" << endl; } }; 函数重写/覆盖 继承关系如果子类中有一个跟父类完全相同函数函数名、函数参数、函数返回值都相同 (三同),则称子类函数重写或者覆盖了父类函数...总结:我们继承关系,可以无脑将父类析构定义为函数;虽然函数建立函数表,使得时空效率有一丢丢浪费,但是避免了可能存在内存泄漏风险,是完全值得。...; 但是继承,我们说要掌握菱形继承和菱形虚拟继承,这是因为校招时要考察;但是几乎没人会去考察菱形继承和菱形虚拟继承表模型,所以我们这里不再对其进行深入探索,如果好奇心比较强童鞋,可以看看程皓大佬写这两篇文章...-- 不能,因为如果构造函数函数的话,实例化对象时需要先从取出构造函数地址,虽然表在编译时就生成好了,但是表指针构造函数初始化列表完成初始化,所以再对象完成构造之前,我们无法通过表指针来访问表...如果函数不是多态调用,则一样块;如果函数是多态调用,则普通函数访问更快,因为函数多态调用需要运行时到表中去取函数地址,然后再 call。 函数表是什么阶段生成,存在哪

44200

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

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

72530

大疆嵌入式一面问题集合

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

95931

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.7K20

c++面试选择题_C语言经典笔试题

对于内部数据类型对象而言,光用maloc/free无法满足动态对象要求。对象创建同时要自动执行构造函数,对象消亡之前要自动执行析构函数。...提供了一种接口界面。允许派生类对基类函数重新定义。 函数作用:基类为其派生类保留一个函数名字,以便派生类根据需要对进行定义。...从基类继承来函数派生类仍是函数。 抽象类不仅包括函数,也可包括函数。抽象类必须用作派生其他类基类,而不能用于直接创建对象实例。但仍可使用指向抽象类指针支持运行时多态性。...(2)使用引用传递函数参数,在内存并没有产生实参副本,它是直接对实参操作;而使用一般变量传递函数参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量副本;如果传递是对象,还将调用拷贝构造函数...动态内存生存期由我们决定,使用非常灵活,但问题也最多。 第29题:基类析构函数不是函数带来什么问题? 派生类析构函数用不上,造成资源泄漏。 第30题:全局变量和局部变量有什么区别?

1K10

嵌入式面试高频考点整理(建议收藏)

定义和声明区别 声明是将一个名称引入程序,定义提供了一个实体程序唯一描述。 什么是野指针 访问一个已销毁或者访问受限内存区域指针。...[16] STLvector实现,是怎么扩容 vector 为空时候没有预分配空间,每次添加一个元素时,判断当前是否还有剩余可用空间,如果没有则进行试探性扩容,并且把内存拷贝到新申请内存空间上...什么函数 基类声明函数,仅有声明无实现。要求派生子类必须定义自身实现方法,达到多态效果。 构造函数什么一般不定义为函数?...引用在创建时候必须初始化访问函数时,编译器根据其所绑定对象类型决定要调用哪个函数。注意只能调用函数。...这两种方式分配都是虚拟内存,没有分配物理内存第一次访问已分配虚拟地址空间时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间映射关系。

64720

精选 30 个 C++ 面试题(含解析)

提供了一种接口界面。允许派生类对基类函数重新定义。 函数作用:基类为其派生类保留一个函数名字,以便派生类根据需要对进行定义。...作为接口而存在函数不具备函数功能,一般不能直接被调用。 从基类继承来函数派生类仍是函数如果一个至少有一个函数,那么这个类被称为抽象类(abstract class)。...抽象类不仅包括函数,也可包括函数。抽象类是必须用作派生其他类基类,而不能用于直接创建对象实例。但仍可使用指向抽象类指针支持运行时多态性。...引用必须被初始化,指针不必。 引用初始化以后不能被改变,指针可以改变所指对象。 不存在指向空值引用,但是存在指向空值指针。 22.基类析构函数不是函数带来什么问题?...15、this指针调用成员变量时,堆栈会发生什么变化? 当在类静态成员函数访问类静态成员时,编译器自动将对象地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。

50130
领券