<细节>为什么构造函数不能是虚函数,为什么有虚析构函数
2014-07-02 15:58
281 查看
1.构造函数为什么不能为虚函数
虚拟调用是一种能够在给定信息不完全的情况下工作的机制。特别地,虚拟允许我们调用某个函数,对于这个函数,仅仅知道它的接口,而不知道具体的对象类型。但是要建立一个对象,你必须拥有完全的信息。特别地,你需要知道要建立的对象的具体类型。因此,对构造函数的调用不可能是虚拟的。
虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造,就会出错。
2.为什么有虚析构函数
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。
虚拟调用是一种能够在给定信息不完全的情况下工作的机制。特别地,虚拟允许我们调用某个函数,对于这个函数,仅仅知道它的接口,而不知道具体的对象类型。但是要建立一个对象,你必须拥有完全的信息。特别地,你需要知道要建立的对象的具体类型。因此,对构造函数的调用不可能是虚拟的。
虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造,就会出错。
2.为什么有虚析构函数
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。
相关文章推荐
- 构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数
- 构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数
- <转>消息如何流动 ----------- 注意 GetMessageMap为虚函数
- display不能解决<jsp:include />的问题,jsp异步加载另外一个jsp页面
- <转>学习node.js,为什么选择node.js,为什么NodeJs这么快
- <C语言 入栈顺序>为什么函数入栈顺序从右往左?
- <<不能承受的生命之轻>>
- 解决properties-maven-plugin不能读取<configuration>的问题
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 为什么要用<!DOCTYPE>声明
- 为什么文件名不能包含下列任何字符 \/:*?“<>|
- 为什么构造函数不能声明为虚函数,析构函数可以
- <s:if test="canSubscribe == 'Y'">能 </s:if> <s:else>不能 </s:else> 单字符需加.toString()
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- <textarea>不能用<textarea/>关闭 ,而是必须用<textarea></textarea>
- <Ibatis in action>中使用动态SQL的一个小细节提示(与CDATA)
- <frameset>和<body>不能共用
- <细节>C++函数形参表调用顺序
- <转>Class.forName的作用以及为什么要用它