构造函数、析构函数、虚函数、内联函数
2009-05-19 11:05
316 查看
首先构造函数不能为虚,其中也不能调用虚函数,即使这样通过编译,也不会启用多态机制,而是静态绑定;
析构函数可以为虚,而且经常为虚,目的是在多态派生体系中正确析构资源;
成员函数的虚属性与内联属性不能并存,编译器不会给虚函数内联的。
有了上述结论,我讲一下自己的理解,其中第一点比较麻烦,有很多种说法,个人认为如果构造函数为虚,则会陷入一个递归灾难,因为VPTR将无法进行正确的初始化,而且将构造函数设置为虚是没有任何意义的,因为在进行构造函数调用的时候,对象的类型是明确的,不存在动态绑定、动态决定创建什么对象的问题。另一个想法可能是如果构造函数为虚,可能会覆盖掉基类的构造函数调用。如果在构造函数中调用虚函数比较好解释,因为这个时候VPTR尚未成功设置,而且对象尚未初始化完成,会出现未定义行为,如果在基类的构造函数中调用虚函数,则在派生类初始化的时候,会先调用基类的构造函数,此时派生类部分尚未初始化,基类构造函数中调用的虚函数就无从可依。。。
第二点比较好理解,第三点是因为内联函数在编译器处理阶段会进行内联替换,将内联函数的代码直接拷贝替换,此时的内联函数将作为调用其的内部代码,而不是一个真正意义上的函数,所以其没有函数地址,也就无法进行VTable的构造,所以将其设置为虚是不会起作用的。
对第一点的理解不是很好,希望能有高手指点
析构函数可以为虚,而且经常为虚,目的是在多态派生体系中正确析构资源;
成员函数的虚属性与内联属性不能并存,编译器不会给虚函数内联的。
有了上述结论,我讲一下自己的理解,其中第一点比较麻烦,有很多种说法,个人认为如果构造函数为虚,则会陷入一个递归灾难,因为VPTR将无法进行正确的初始化,而且将构造函数设置为虚是没有任何意义的,因为在进行构造函数调用的时候,对象的类型是明确的,不存在动态绑定、动态决定创建什么对象的问题。另一个想法可能是如果构造函数为虚,可能会覆盖掉基类的构造函数调用。如果在构造函数中调用虚函数比较好解释,因为这个时候VPTR尚未成功设置,而且对象尚未初始化完成,会出现未定义行为,如果在基类的构造函数中调用虚函数,则在派生类初始化的时候,会先调用基类的构造函数,此时派生类部分尚未初始化,基类构造函数中调用的虚函数就无从可依。。。
第二点比较好理解,第三点是因为内联函数在编译器处理阶段会进行内联替换,将内联函数的代码直接拷贝替换,此时的内联函数将作为调用其的内部代码,而不是一个真正意义上的函数,所以其没有函数地址,也就无法进行VTable的构造,所以将其设置为虚是不会起作用的。
对第一点的理解不是很好,希望能有高手指点
相关文章推荐
- C++语言特性:构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏
- 构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
- 构造函数不能为虚函数,析构函数可以为虚函数
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
- <细节>为什么构造函数不能是虚函数,为什么有虚析构函数
- 构造函数、析构函数是否要定义为虚函数?
- 构造函数不能是虚函数 基类析构函数必须为虚函数
- 在构造函数和析构函数中调用虚函数
- C++中构造函数、static修饰函数、内联函数、友元函数不能是虚函数
- 构造函数和析构函数能否声明为虚函数,能否在里面调用虚函数
- 构造函数,析构函数,虚函数等易错混淆点
- C++中,为什么构造函数不能够是虚函数,而析构函数可以是虚函数,而且最好是虚函数
- 内联函数,构造函数,静态函数都不能是虚函数
- 虚函数-构造函数-析构函数
- 虚函数,构造函数,析构函数调用
- C++:构造函数和析构函数能否为虚函数
- 构造函数,析构函数可不可以是虚函数?
- 内联函数,构造函数,静态函数都不能是虚函数
- 构造函数和析构函数,在C++中能否声明为虚函数?构造函数和析构函数里面能否调用虚函数?