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

【C++】继承和多态高频面试题整理

( ) A:派生类的虚函数与基类的虚函数具有不同的参数个数和类型 B:内联函数不能是虚函数(可以认为语法上可以) C:派生类必须重新定义基类的虚函数 D:虚函数可以是一个static型的函数 答案...关于虚表说法正确的是( ) A:一个类只能有一张虚表 B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表 C:虚表是在运行期间动态生成的 D:一个类的不同对象共享该类的虚表...2.4 inline函数可以是虚函数吗? 这个问题之前没讲,我们来说一说。 内联函数可以是虚函数吗?大家想一想 我们先来回顾一下,什么是内联函数?...那这样的话,如果一个内联函数真的被处理成内联函数的话,它是没有地址的,那没有地址的函数能是虚函数吗? 肯定是不行的,因为虚函数必须有地址,而且地址要放进虚函数表里面。...2.6 构造函数可以是虚函数吗? 答: 不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。 2.7 析构函数可以是虚函数吗?什么场景下析构函数要搞成虚函数?

31710

闭关多日,整理一份C++中那些重要又容易忽视的细节

虚函数的工作原理 友元 了解一下友元函数吧 友元函数是否破坏了类的封装性 什么时候使用友元函数: ---- 基础篇 喜欢用内联函数吗?...派生类对象包含一个指向独立地址表的指针。如果派生类提供了虚函数的新定义,该函数表将保存新函数的地址;如果派生类没有重新定义虚函数,该vtbl将保存函数原始版本的地址。...调用虚函数时,程序将查看存储在对象中的vtbl地址,然后转向相应的函数地址表。如果使用类声明中定义的第一个虚函数,则程序将使用数组中中的第一个函数地址,并执行具有该地址的函数。...一个函数可以是多个类的友元函数,只需要在各个类中分别声明。 友元函数的调用与一般函数的调用方式和原理一致。 友元函数虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。...友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。

59410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    总结继承和多态的一些问题

    2.区分虚表和虚表指针生成阶段 虚表是在编译阶段就生成的了,而虚表指针是在构造函数初始化列表阶段初始化的。这也侧面回答了下一个问题。 3.构造函可以是虚函数吗?...②然后根据重写的虚函数,对虚表进行覆盖。 ③最后是把自个类中的虚函数的地址也写进虚表中。 也就是说,派生类的虚表一开始是对基类的虚表的一个拷贝,后面才将其“本土化”。...而指针或者引用是直接指向派生类对象,不会进行拷贝赋值,这样虚函数表是派生类的虚函数表,故能实现多态。 5.inline函数可以是虚函数吗?...内联函数可以写成虚函数,不过写出虚函数后,这个内联函数就不是内联函数了。 6.静态成员可以是虚函数吗?...如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。 9.什么是抽象类?抽象类的作用? 一个类中的虚函数如果是纯虚函数的话,那么这个类便是抽象类。

    45720

    多态

    多态的定义及实现 多态是类继承时,对象去调用同一个对象产生不同的行为 要构成多态的条件有两个 虚函数的重写 基类的对象或引用调用虚函数 虚函数的重写 什么是虚函数?...虚表的指针它是一个函数指针数组指针,什么意思呢?——它是一个指针,它指向一个数组,数组的每个元素都是一个函数指针。...printvf((VF*)*(int*)c, 3); return 0; } 直接看结果: 可以看出多继承有多个虚表,子类没有重写的函数放在第一个虚表中 面试常见的问题 inline函数可以是虚函数吗...静态成员可以是虚函数吗? 构造函数,拷贝构造,赋值运算符的重载可以是虚函数吗? 析构函数可以是虚函数吗? 对象访问普通函数快还是虚函数快 虚函数表在什么阶段产生的,存在哪里?...赋值运算符的重载是可以是虚函数的 析构函数可以是虚函数,虽然析构函数的函数名不一样,但是在编译器看来,都被处理为destructor,上文有解释为什么要把析构函数写成虚函数。

    26020

    QT常见面试题,基础知识偏多

    大家好,又见面了,我是你们的朋友全栈君。 自定义控件: 应该做过吧?能举几个例子吗?还有其他的吗? 你觉得自定义控件的方法主要是哪些?...答:*编译期:检查信号与槽是否存在,参数类型检查,Q_OBJECT是否存在 *信号可以和普通的函数、类的普通成员函数、lambda函数连接(而不再局限于信号函数和槽函数) *参数可以是 typedef...槽函数可以是虚函数吗? 答:回调函数。可以。 信号槽同步与异步: 信号槽是同步的还是异步的?分别如何实现?...虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。...虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。 5.

    5.9K10

    冲进银行测开,扛住了!

    多态的实现原理主要涉及到两个概念:虚函数表(vtable)和虚函数指针(vptr)。每个含有虚函数的类,或者从这样的类派生的类,都有一个虚函数表。这个表中存储了虚函数的地址。...类的对象中包含一个虚函数指针,指向这个虚函数表。当我们通过基类的指针或引用调用虚函数时,实际上是通过这个虚函数指针找到虚函数表,然后在表中查找并调用相应的函数。...虚函数:在基类中声明一个虚函数,派生类可以对该虚函数进行重写。通过使用虚函数,可以在运行时根据实际对象的类型来调用相应的函数,而不是根据指针或引用的类型。...实现多态的步骤如下: 定义基类:定义一个基类,并在其中声明一个或多个虚函数。 派生类:从基类派生出一个或多个派生类,并在派生类中重写基类的虚函数。...Animal类中声明了一个虚函数makeSound,派生类Dog和Cat分别重写了这个虚函数。

    25320

    C++:多态

    virtual void func(int val = 1) { cout " << val << endl; } 打个不恰当的比喻,虚函数的重写就是把一个人的头(函数声明)接到了另一个人的身子上...多态的实现原理? 答:静态多态:函数名修饰规则;动态多态:虚函数表。 4. inline 函数可以是虚函数吗?...答:可以,不过编译器就忽略 inline 属性,这个函数就不再是inline,因为虚函数要放到虚表中去。 5. 静态成员可以是虚函数吗? 答:不能。静态成员函数属于类本身,而不是类的某个特定对象。...两者的这种特性有所冲突,所以禁止将静态成员函数声明为虚函数。 6. 构造函数可以是虚函数吗? 答:不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。 7....析构函数可以是虚函数吗?什么场景下析构函数是虚函数? 答:可以,并且最好把基类的析构函数定义成虚函数。参考上述内容。 8. 对象访问普通函数快还是虚函数更快?

    9710

    什么?CC++面试过不了?因为你还没看过这个!

    内联函数在运行时可调试,而宏定义不可以。 虚函数(virtual)可以是内联函数(inline)吗?...虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。...) 内联函数不能是表现多态性时的虚函数,解释见:虚函数(virtual)可以是内联函数(inline)吗?...带纯虚函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。 虚基类是虚继承中的基类,具体见下文虚继承。...虚函数不占用存储空间 虚函数表存储的是虚函数地址 模板类、成员模板、虚函数 模板类中可以使用虚函数 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 抽象类、接口类、聚合类

    3.7K50

    每日一问06 构造函数可以是虚函数吗

    技术分类:开发语言 前置知识:虚函数工作原理 推荐阅读 :[侯捷]C++内存管理--从平地到万丈高楼 https://www.bilibili.com/video/BV1Kb411B7N8 思路 构造函数可以是虚函数吗...是有构造函数特点决定的 虚函数使用条件必须是通过指针或者引用调用 构造函数无法通过指针直接调用。只能通过 placement new方式调用。...void* operator new (std::size_t size, void* ptr) noexcept 构造函数不能成为虚函数 ? ? 构造函数无法继承,只属于具体一个类。无法抽象。...根本说不清楚:必须创建好了,才能用,不懂 抽象和具体关系.接口不属于具体一个类 析构函数可以是虚函数吗,为什么 参考思路: 可以是 析构函数 执行顺序是 派生类 ,基类 如果析构函数不被声明成虚函数,则编译器实施静态绑定...,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。

    70930

    【C++】多态

    虚函数的重写(也可以叫覆盖): 派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...那另一个条件呢? 2.2.2 条件2:基类的指针或者引用调用虚函数 第二个条件: 必须通过基类的指针或者引用调用虚函数 我们先学语法,后面会给大家讲原理。...另外还可以是基类的指针去调用: 我们说必须是基类的指针或者引用去调用虚函数,那就意味着用基类的对象是不行的: 虽然没有报错,但是并没有实现多态。...但是: 重写不是要求基类和派生类的虚函数名字一样吗,可是它们两个的析构函数名字并不一样啊。...我们来一起分析一下: 首先,父类里面有两个虚函数:func和test。 但是子类只对func进行了重写。 然后main函数里面用了一个子类对象的指针去调用test函数,能调到吗?

    12410

    C语言与C++面试知识总结

    内联函数在运行时可调试,而宏定义不可以。 虚函数(virtual)可以是内联函数(inline)吗?...虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。...) 内联函数不能是表现多态性时的虚函数,解释见:虚函数(virtual)可以是内联函数(inline)吗?...带纯虚函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。 虚基类是虚继承中的基类,具体见下文虚继承。...虚函数不占用存储空间 虚函数表存储的是虚函数地址 模板类、成员模板、虚函数 模板类中可以使用虚函数 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 抽象类、接口类、聚合类

    5K41

    C++:深入理解多态

    多态的实现原理? 4. inline函数可以是虚函数吗? 答:可以,不过为了能够将该虚函数放进虚表中,编译器会忽略掉inline的特性,因为本身inline就是一个建议。...在某些函数必须出现在代码段(常量区)的时候,inline会妥协并失去作用 5. 静态成员可以是虚函数吗?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 6. 构造函数、拷贝构造可以是虚函数吗?...答:不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。 7、赋值重载可以是虚函数吗??...答:可以,但是不建议,因为这样的话如果没有触发多态,父类的赋值重载就会被隐藏,子类就调用不了父类的赋值重载了。 8. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

    9500

    【C++】多态——实现、重写、抽象类、多态原理

    一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。注意区分虚基本,虚基表是偏移量。...我们来打印出来: 此时func3()就找到了,所以多继承派生类的未重写的虚函数放在第一个继承基类部分的虚函数表中。另一个虚表有没有func3()呢?...= p3 ---- 十、总结 1.inline函数可以是虚函数吗?...函数没有地址,无法把地址放到虚函数表中,所以总结就是对于多态调用没有inline属性,普通调用可以继续保持inline属性 2.静态成员可以是虚函数吗?...不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3.构造函数可以是虚函数吗?

    56131

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——11.多态

    ):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的 返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数 的地址要被放到虚函数表中,虚函数表也简称虚表,。那么派生类中这个表放了些什么呢?...,先复制父类的虚表 2.student重写虚函数时,会生成一个新的虚表,存放重写的虚函数指针,并代替原来的虚表 1....静态成员可以是虚函数吗? 答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 6. 构造函数可以是虚函数吗?...答:不能,因为对象中的虚函数表指针是在构造函数初始化列表 阶段才初始化的。 7. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

    8710

    冲进银行测开,扛住了!

    多态的实现原理主要涉及到两个概念:虚函数表(vtable)和虚函数指针(vptr)。每个含有虚函数的类,或者从这样的类派生的类,都有一个虚函数表。这个表中存储了虚函数的地址。...类的对象中包含一个虚函数指针,指向这个虚函数表。当我们通过基类的指针或引用调用虚函数时,实际上是通过这个虚函数指针找到虚函数表,然后在表中查找并调用相应的函数。...虚函数:在基类中声明一个虚函数,派生类可以对该虚函数进行重写。通过使用虚函数,可以在运行时根据实际对象的类型来调用相应的函数,而不是根据指针或引用的类型。...实现多态的步骤如下: 定义基类:定义一个基类,并在其中声明一个或多个虚函数。 派生类:从基类派生出一个或多个派生类,并在派生类中重写基类的虚函数。...Animal类中声明了一个虚函数makeSound,派生类Dog和Cat分别重写了这个虚函数。

    25220

    【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】

    函数类型、函数名和形参表: 函数类型:规定了函数返回值的类型,可以是基本数据类型(如 int、double 等),也可以是指针、引用或者自定义的类类型等。...形参表:列出函数接受的参数的类型和参数名(参数名可省略,如果只是声明函数时,在函数实现时再写具体参数名),形参表决定了函数的参数特征,在派生类重写虚函数时,形参表必须和基类中对应的虚函数形参表完全一致(...例如,在一个图形处理库中,定义一个基类 Shape,其中有一个纯虚函数 draw,表示绘制图形的操作,但由于不同形状的图形绘制方式各异,在基类中无法给出通用的实现,于是声明为纯虚函数: class Shape...strstr 函数的功能是在一个字符串中查找另一个子字符串首次出现的位置,如果找到了,就返回指向该子字符串在原字符串中起始位置的指针;如果没找到,则返回空指针。...strstr 函数的功能是在一个给定的字符串(通常称为主字符串)中查找另一个指定的字符串(通常称为子字符串)首次出现的位置。

    9410

    三大特性之多态

    多态是不同继承关系的类对象去调用同一个函数,产生了不同效果的行为。 静态的多态 调用同一个函数,产生不同效果的行为,这不就是函数重载吗!...虚函数的重写也可以被称为虚函数的覆盖,因为带有虚函数的类都有一个虚函数表,在继承的时候子类会继承父类的虚函数表,如果子类对某一个虚函数进行重写了,那么该虚函数在子类的虚函数表中就会被重写的虚函数覆盖。...但这个类的大小为4字节 这是因为如果一个类中有虚函数,那么该类中会有一个隐藏的指针,该指针指向一个虚函数表。...inline函数可以是虚函数吗? 答:可以,不过编译器就忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去。 静态成员可以是虚函数吗? ​...答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?

    18520

    【C++】三大特性之多态

    一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。那么派生类中这个表放了些什么呢?...C++虚函数表解析 C++对象的内存布局 ---- 六、一些关于多态的问题 1. inline函数可以是虚函数吗?...答:可以,不过编译器就忽略inline属性,这个函数就不再是 inline,因为虚函数要放到虚表中去。 2. 静态成员可以是虚函数吗?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3. 构造函数可以是虚函数吗?...答:不能,因为对象中的虚函数表指针是在构造函数初始化列表 阶段才初始化的。 4. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

    78250

    【C++】多态(定义、虚函数、重写、隐藏)

    虚函数的重写 虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的 返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数 的地址要被放到虚函数表中,虚函数表也简称虚表。...我们依旧可以自己打印出来看,这里直接给出答案,func3放在了base1的虚表里面。 结论:多继承派生类的未重写的虚函数放在第一个继承基类部分的虚函数表中。...问答题 inline函数可以是虚函数吗?答:可以,不过编译器就忽略inline属性,这个函数就不再是 inline,因为虚函数要放到虚表中去。 静态成员可以是虚函数吗?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?

    18010
    领券