为什么构造函数不能为虚函数,而析构函数可以为虚函数?
2016-09-11 23:59
525 查看
1. 为什么构造函数不能为虚函数?
虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。
2. 为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?
首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。
举例说明:
子类B继承自基类A;A *p = newB; delete p;
1)此时,如果类A的析构函数不是虚函数,那么deletep;将会仅仅调用A的析构函数,只释放了B对象中的A部分,而派生出的新的部分未释放掉。
2) 如果类A的析构函数是虚函数,deletep; 将会先调用B的析构函数,再调用A的析构函数,释放B对象的所有空间。
补充: B *p = new B; deletep;时也是先调用B的析构函数,再调用A的析构函数。
虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。
2. 为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?
首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。
举例说明:
子类B继承自基类A;A *p = newB; delete p;
1)此时,如果类A的析构函数不是虚函数,那么deletep;将会仅仅调用A的析构函数,只释放了B对象中的A部分,而派生出的新的部分未释放掉。
2) 如果类A的析构函数是虚函数,deletep; 将会先调用B的析构函数,再调用A的析构函数,释放B对象的所有空间。
补充: B *p = new B; deletep;时也是先调用B的析构函数,再调用A的析构函数。
相关文章推荐
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能是虚函数而析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么不能把构造函数设为虚函数,却可以把析构函数设为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不可以被声明为虚函数而析构函数有时候必须声明为虚函数
- 为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数