构造函数能否为虚函数?
在构造函数中调用虚函数会如何?
析构函数能否为虚函数?
析构函数能否为纯虚函数?
其实日常开发中基本上不会遇到这些问题,但是架不住有些面试官喜欢刨根问底呀,所以这里总结一下:
构造函数能否为虚函数
不能。
1.虚函数是通过vtable来调用的,构造时对象还没有实例化,没有内存空间,无法找到vtable。
2.虚函数的作用在于通过父类的指针或引用调用的时候能变成调用子类的对应成员函数,而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用。
3.在调用构造函数时还不能确定对象的真实类型(子类会调用父类的构造函数)。
在构造函数中调用虚函数会如何
可以调用,但不能达到多态的效果。
如果在基类的构造函数中调用虚函数时调用到了派生类的实现,由于此时派生类尚未构造,会出现访问未初始化成员等问题。
对象的虚函数表指针在构造的过程中是不断变化的,基类构造时会绑定到基类的虚函数表,派生类构造时再绑定到派生类的虚函数表,所以在哪个类的构造函数中调用虚函数就会调用到哪个类的实现。
析构函数能否为虚函数
可以,并且在作为基类时必须是虚函数。
我们可以通过基类的指针来销毁对象,此时如果析构函数不是虚函数,就不能正确调用析构函数,造成只有基类的部分被析构,出现内存泄漏。
析构函数能否为纯虚函数
可以,但一般没必要。
class Base
{
public:
Base(){}
virtual ~Base()= 0
};
我们直接编译这段代码时会出现link错误,找不到符号~Base。但是我们可以给纯虚析构函数一个函数体:
Base::~Base() {}
这样就可以编译通过了。
1.将一个函数定义为纯虚函数,实际上是将这个类定义为抽象类,禁止实例化
2.纯虚函数通常没有定义体,但也完全可以拥有
网友评论