程序员面试宝典1.1中有一个常见的问题:为什么构造函数不能是虚函数?我们可以从两个角度来回答这个问题。首先,从存储空间角度来看,虚函数对应一个vtable(虚函数表),但是vtable存储在对象的内存空间中,如果构造函数是虚函数,就需要通过vtable来调用,但是对象还没有实例化,也就是内存空间还没有分配,无法找到vtable,所以构造函数不能是虚函数。其次,从使用角度来看,虚函数主要用于在信息不全的情况下能使重载的函数得到对应的调用。但是构造函数本身就是要初始化实例,使用虚函数也没有实际意义。因此构造函数没有必要是虚函数。
需要注意的是,虽然构造函数不能是虚函数,但析构函数却可以是虚函数。因为我们往往通过基类的指针来销毁对象,这时候如果析构函数不是虚函数就不能正确识别对象类型,从而不能正确调用析构函数。
暂无评论