C++类的构造函数不能为虚函数的原因
2016-03-02 22:17
405 查看
1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化;
我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的;那么问题来了,如果构造函数为虚函数,此时的内存是一片空白,不存在该虚函数表vtable,那么无法找到该构造函数;所以说,构造函数不能为虚函数。2 此外,如果有以下代码:
对于析构函数而言,可以为虚函数,因为此时虚函数表早已建立;并且,常常析构函数都是虚函数。原因就是,通过基类指针在销毁对象的时候,可以正确的识别要销毁对象的类型,从而防止析构不完全的出现。
我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的;那么问题来了,如果构造函数为虚函数,此时的内存是一片空白,不存在该虚函数表vtable,那么无法找到该构造函数;所以说,构造函数不能为虚函数。2 此外,如果有以下代码:
class A{ A() {} }; class B: public A{ B():A() {} }; int main(){ B b; B *pb = &b; }则构造B类的时候,构造函数执行顺序是:A() B()根据虚函数的性质,如果A的构造函数为虚函数,且B类也给出了构造函数,则应该只执行B类的构造函数,不再执行A类的构造函数,这样A就无法构造了,产生了矛盾;因此,构造函数不能为虚函数。
对于析构函数而言,可以为虚函数,因为此时虚函数表早已建立;并且,常常析构函数都是虚函数。原因就是,通过基类指针在销毁对象的时候,可以正确的识别要销毁对象的类型,从而防止析构不完全的出现。
相关文章推荐
- 一个程序员的Java和C,C++学习之路(整理)
- DSP 2812: 使用C++封装外设时钟控制
- C语言内存四区
- DSP 2812: 使用C++封装CPU级别的操作
- C++单链表的设计与实现
- C++学习
- java c# ios c++
- C语言内存管理
- GitHub 通告:整理了一个 C 和 C++ 开源库的清单(含示例代码)
- C++基础知识易错点总结(3)
- 九度-题目1088:剩下的树
- c语言实现无向图的邻接表储存
- C++练手之计算老妈的工作时间段
- DSP 2812: 使用C++封装系统时钟管理模块
- <<Effective C++>>读书笔记(一)
- Rational Number.c
- C++内存布局(上)
- C语言注释转换为c++的注释
- C++学习之继承和派生
- 结构体嵌套对齐