C++类的构造函数不能为虚函数的原因
2016-07-16 20:01
323 查看
1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化;
我们知道,存在虚函数的话,也会存在一个虚函数表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就无法构造了,产生了矛盾;因此,构造函数不能为虚函数。
对于析构函数而言,可以为虚函数,因为此时虚函数表早已建立;并且,常常析构函数都是虚函数。原因就是,通过基类指针在销毁对象的时候,可以正确的识别要销毁对象的类型,从而防止析构不完全的出现。
我们知道,存在虚函数的话,也会存在一个虚函数表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就无法构造了,产生了矛盾;因此,构造函数不能为虚函数。
对于析构函数而言,可以为虚函数,因为此时虚函数表早已建立;并且,常常析构函数都是虚函数。原因就是,通过基类指针在销毁对象的时候,可以正确的识别要销毁对象的类型,从而防止析构不完全的出现。
相关文章推荐
- C++ STL库的总结以及实现原理
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 错误的解决方法
- 在使用VC++6.0常见问题“Error spawning cl.exe”的解决方法
- C语言返回值详解
- leetcode_c++:链表:Remove Duplicates from Sorted List II(082)
- c语言中i++,++i的计算
- leetcode_c++:链表:Rotate List(061)
- 【字符串】C++字符串编程小结
- C++ FUNCTION FOR ACM
- C++笔记 explicit构造函数
- C++中多态的实现原理
- C++中基类和派生类之间的转换实例
- C++中的前向声明(ForwardDeclaration)
- C++静态库与动态库
- C++ PP Chapter VIII 函数探幽
- ROS学习之cpp教程
- Leetcode 171. Excel Sheet Column Number (Easy) (cpp)
- POJ 1200 Crazy Search
- [C++]高效使用关联容器的一些建议
- Balanced Binary Tree