构造函数为什么不能是虚函数?
1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。。。 2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。
|
析构函数为什么总是虚函数?
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
当基类的析构函数不为虚的话,其子类中所有的成员变量的类中分配的内存也将可能泄漏。
总的来说,因为调用析构函数的话,(安全转化为指向父类的指针了)对象指针指向父类,肯定先调用父类的析构函数,那么子类的资源并没有被释放,所以为了避免这种情况,把
父类的析构函数声明为virtual,(在子类中重载)那么则会先调用子类的析构函数,最后再调用父类的析构函数
所以强烈建议在基类中把析构函数声明为虚函数,但是只有你写的类并不做为基类时例外。