美文网首页
C++虚函数的一些奇怪问题总结

C++虚函数的一些奇怪问题总结

作者: 丑角的晨歌 | 来源:发表于2018-07-29 19:24 被阅读0次

构造函数能否为虚函数?
在构造函数中调用虚函数会如何?
析构函数能否为虚函数?
析构函数能否为纯虚函数?
其实日常开发中基本上不会遇到这些问题,但是架不住有些面试官喜欢刨根问底呀,所以这里总结一下:
构造函数能否为虚函数
不能。
1.虚函数是通过vtable来调用的,构造时对象还没有实例化,没有内存空间,无法找到vtable。
2.虚函数的作用在于通过父类的指针或引用调用的时候能变成调用子类的对应成员函数,而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用。
3.在调用构造函数时还不能确定对象的真实类型(子类会调用父类的构造函数)。
在构造函数中调用虚函数会如何
可以调用,但不能达到多态的效果。
如果在基类的构造函数中调用虚函数时调用到了派生类的实现,由于此时派生类尚未构造,会出现访问未初始化成员等问题。
对象的虚函数表指针在构造的过程中是不断变化的,基类构造时会绑定到基类的虚函数表,派生类构造时再绑定到派生类的虚函数表,所以在哪个类的构造函数中调用虚函数就会调用到哪个类的实现。
析构函数能否为虚函数
可以,并且在作为基类时必须是虚函数。
我们可以通过基类的指针来销毁对象,此时如果析构函数不是虚函数,就不能正确调用析构函数,造成只有基类的部分被析构,出现内存泄漏。
析构函数能否为纯虚函数
可以,但一般没必要。

class Base
{
public:
   Base(){}
   virtual ~Base()= 0
};

我们直接编译这段代码时会出现link错误,找不到符号~Base。但是我们可以给纯虚析构函数一个函数体:

Base::~Base() {}

这样就可以编译通过了。
1.将一个函数定义为纯虚函数,实际上是将这个类定义为抽象类,禁止实例化
2.纯虚函数通常没有定义体,但也完全可以拥有

相关文章

  • C++虚函数的一些奇怪问题总结

    构造函数能否为虚函数?在构造函数中调用虚函数会如何?析构函数能否为虚函数?析构函数能否为纯虚函数?其实日常开发中基...

  • C/C++32位与64位数据类型占用的字节数

    C++继承、虚继承、虚函数类的大小问题

  • c++面试问题总结

    1.c++面试问题总结:(1)空类的大小,仅含有虚函数类的大小(2)析构函数声明为虚函数的作用(3)C++多态的实...

  • C++ 虚函数表、虚函数讲解

    前言 近期有不少同学私信我询问关于C++ 虚表和虚函数的相关问题,于是就打算写一篇关于C++虚函数和虚表的原理文章...

  • C++ 虚函数

    C++ 虚函数 虚函数 基类中使用virtual关键字声明的函数,称为虚函数。虚函数的实现,通过虚函数表来实现的。...

  • C++ 虚函数 总结

    虚函数是 C++ 实现多态的方式。 什么是多态?多态性常被视为自封装和继承之后,面向对象的编程的第三个支柱。如果举...

  • C++学习笔记

    C++面对对象 实函数,虚函数,纯虚函数,函数重写 虚函数:需要进行子类的重写时。virtual void 函数名...

  • pwnable.kr之uaf && c++虚函数

    c++的逆向还是要熟悉下。 一、关于c++虚函数 虚函数使得c++能够实现多态,每个类有一个虚表,每个对象在实现的...

  • C++ 类虚函数原理

    学习过C++的童鞋都知道C++类成员函数可以分为虚函数和非虚函数,(java程序员就请绕过这个问题,因为java类...

  • (Boolan) 面向对象高级编程(下)第四周笔记

    一、虚函数表 对C++ 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)...

网友评论

      本文标题:C++虚函数的一些奇怪问题总结

      本文链接:https://www.haomeiwen.com/subject/wibimftx.html