总结了一些常见的面试题,通过查阅资料给出了一些浅薄的解析,欢迎各位批评指教。
- inliine函数可以实虚函数码?
不可以,因为inline函数没有地址,无法将他存放到虚函数表中。
- 静态成员可以是虚函数吗?
不能,因为静态成员函数中没有this指针,使用::成员函数的嗲用用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。
因为:
首先什么是static静态成员函数?静态成员函数不属于类中的任何一个对象和实例,属于类共有的一个函数。也就是说,它不能用this指针来访问,因为this指针指向的是每一个对象和实例。
对于virtual虚函数,它的调用恰恰使用this指针。在有虚函数的类实例中,this指针调用vptr指针,指向的是vtable(虚函数列表),通过虚函数列表找到需要调用的虚函数的地址。总体来说虚函数的调用关系是:this指针->vptr(4字节)->vtable ->virtual虚函数。
所以说,static静态函数没有this指针,也就无法找到虚函数了。所以静态成员函数不能是虚函数。他们的关键区别就是this指针。
构造函数不能为const函数,构造函数的目的就是为了给成员变量赋初值,不能为const函数
- 构造函数可以是虚函数吗?
不可以,因为对象中的虚函数指针是在对象构造的时候初始化的。
因为:
虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。
- 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?
可以,最好将析构函数设置为虚函数最好是将父类的析构函数设置为虚函数 ,因为这样可以避免内存泄漏的问题。如果一个父类的指针指向了子类的的对象,并且父类的虚函数没有设置成虚函数,那么子类对象中的虚函数就没有实现多态,他只会调用父类的析构函数,不会调用子类的析构函数,但是他创建对象的时候调用了子类的构造函数,所以说就用子类的构造函数就应该该取调用他的析构函数,这样才能保证所有的必须释放的资源都是放了,才可以保证不会有内存泄漏。如果是多态的,就会先去调用子类的析构函数,然后再取调用父类的析构函数,这样子类