欢迎来到天天文库
浏览记录
ID:13786199
大小:34.50 KB
页数:7页
时间:2018-07-24
《类继承中构造函数和析构函数的调用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、类继承中构造函数和析构函数的调用作者: 来源:CSDN 点击:119 日期:2007-4-2616:45:44 类继承中构造函数和析构函数的调用现在,有三个类,类的定义如下classCA{public: CA(){cout<<"CAconstructor"<2、assCC:publicCB{public: CC(){cout<<"CCconstructor"<3、uctor靠,太简单了,一个鸡蛋飞过来了,:(继续……………………(2)再做第二个试验之前,先做一点小小修改~CA(){cout<<"CAdesstructor"<>>virtual ~CA(){cout<<"CAdesstructor"<4、r但是如果把virtual ~CA(){cout<<"CAdesstructor"<5、数要设置成虚拟的,有些类虽然是基类,但是不是用于多态的,没有虚函数,没有被设计成允许经由基类接口派生类对象进行操作,那么也无需设成虚析构函数,毕竟增加了开销,好了,解释清楚了,我们也知道怎么做了,继续试验(3)保留CA中的虚析构函数修改main代码如下intmain(){ CB*p=newCC(); deletep; return0;}运行结果CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor取消CA中的虚析构函数,那么,CA,CB,CC中没有虚析构函数6、那么3中代码运行结果如下CAconstructorCBconstructorCCconstructorCBdesstructorCAdesstructor只调到CB的析构哦,继续试验,CA,CB,CC中,只有CB是虚析构函数3中代码运行如下CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor所以,如果是CB指向派生类,只要CB或者其基类中存在虚析构函数,那么也是所有的析构函数都调用的了继续………………(4)修改main代码如下intmain(){ CA*p=n7、ewCC(); deletep; return0;}如果A的析构函数是虚的,那么情况如2,不多说了如果是CA的析构函数不是虚的,而CB或者CC的析构函数是虚拟的,那么在调用deletep;会出现内存错误Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 是在释放内存的时候出现这样的错误上网查了一下,_BLOCK_TYPE_IS_VALID是用来检测内存有效性宏中的一个,这个错误说明指针使用出现了问题后来想了一想,应该是因为继承类中出现了虚函数,所以多了一个指向虚函数表的指针,而基类中一个虚函数都没有,所以也没有8、这个指针啦
2、assCC:publicCB{public: CC(){cout<<"CCconstructor"<3、uctor靠,太简单了,一个鸡蛋飞过来了,:(继续……………………(2)再做第二个试验之前,先做一点小小修改~CA(){cout<<"CAdesstructor"<>>virtual ~CA(){cout<<"CAdesstructor"<4、r但是如果把virtual ~CA(){cout<<"CAdesstructor"<5、数要设置成虚拟的,有些类虽然是基类,但是不是用于多态的,没有虚函数,没有被设计成允许经由基类接口派生类对象进行操作,那么也无需设成虚析构函数,毕竟增加了开销,好了,解释清楚了,我们也知道怎么做了,继续试验(3)保留CA中的虚析构函数修改main代码如下intmain(){ CB*p=newCC(); deletep; return0;}运行结果CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor取消CA中的虚析构函数,那么,CA,CB,CC中没有虚析构函数6、那么3中代码运行结果如下CAconstructorCBconstructorCCconstructorCBdesstructorCAdesstructor只调到CB的析构哦,继续试验,CA,CB,CC中,只有CB是虚析构函数3中代码运行如下CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor所以,如果是CB指向派生类,只要CB或者其基类中存在虚析构函数,那么也是所有的析构函数都调用的了继续………………(4)修改main代码如下intmain(){ CA*p=n7、ewCC(); deletep; return0;}如果A的析构函数是虚的,那么情况如2,不多说了如果是CA的析构函数不是虚的,而CB或者CC的析构函数是虚拟的,那么在调用deletep;会出现内存错误Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 是在释放内存的时候出现这样的错误上网查了一下,_BLOCK_TYPE_IS_VALID是用来检测内存有效性宏中的一个,这个错误说明指针使用出现了问题后来想了一想,应该是因为继承类中出现了虚函数,所以多了一个指向虚函数表的指针,而基类中一个虚函数都没有,所以也没有8、这个指针啦
3、uctor靠,太简单了,一个鸡蛋飞过来了,:(继续……………………(2)再做第二个试验之前,先做一点小小修改~CA(){cout<<"CAdesstructor"<>>virtual ~CA(){cout<<"CAdesstructor"<4、r但是如果把virtual ~CA(){cout<<"CAdesstructor"<5、数要设置成虚拟的,有些类虽然是基类,但是不是用于多态的,没有虚函数,没有被设计成允许经由基类接口派生类对象进行操作,那么也无需设成虚析构函数,毕竟增加了开销,好了,解释清楚了,我们也知道怎么做了,继续试验(3)保留CA中的虚析构函数修改main代码如下intmain(){ CB*p=newCC(); deletep; return0;}运行结果CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor取消CA中的虚析构函数,那么,CA,CB,CC中没有虚析构函数6、那么3中代码运行结果如下CAconstructorCBconstructorCCconstructorCBdesstructorCAdesstructor只调到CB的析构哦,继续试验,CA,CB,CC中,只有CB是虚析构函数3中代码运行如下CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor所以,如果是CB指向派生类,只要CB或者其基类中存在虚析构函数,那么也是所有的析构函数都调用的了继续………………(4)修改main代码如下intmain(){ CA*p=n7、ewCC(); deletep; return0;}如果A的析构函数是虚的,那么情况如2,不多说了如果是CA的析构函数不是虚的,而CB或者CC的析构函数是虚拟的,那么在调用deletep;会出现内存错误Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 是在释放内存的时候出现这样的错误上网查了一下,_BLOCK_TYPE_IS_VALID是用来检测内存有效性宏中的一个,这个错误说明指针使用出现了问题后来想了一想,应该是因为继承类中出现了虚函数,所以多了一个指向虚函数表的指针,而基类中一个虚函数都没有,所以也没有8、这个指针啦
4、r但是如果把virtual ~CA(){cout<<"CAdesstructor"<5、数要设置成虚拟的,有些类虽然是基类,但是不是用于多态的,没有虚函数,没有被设计成允许经由基类接口派生类对象进行操作,那么也无需设成虚析构函数,毕竟增加了开销,好了,解释清楚了,我们也知道怎么做了,继续试验(3)保留CA中的虚析构函数修改main代码如下intmain(){ CB*p=newCC(); deletep; return0;}运行结果CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor取消CA中的虚析构函数,那么,CA,CB,CC中没有虚析构函数6、那么3中代码运行结果如下CAconstructorCBconstructorCCconstructorCBdesstructorCAdesstructor只调到CB的析构哦,继续试验,CA,CB,CC中,只有CB是虚析构函数3中代码运行如下CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor所以,如果是CB指向派生类,只要CB或者其基类中存在虚析构函数,那么也是所有的析构函数都调用的了继续………………(4)修改main代码如下intmain(){ CA*p=n7、ewCC(); deletep; return0;}如果A的析构函数是虚的,那么情况如2,不多说了如果是CA的析构函数不是虚的,而CB或者CC的析构函数是虚拟的,那么在调用deletep;会出现内存错误Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 是在释放内存的时候出现这样的错误上网查了一下,_BLOCK_TYPE_IS_VALID是用来检测内存有效性宏中的一个,这个错误说明指针使用出现了问题后来想了一想,应该是因为继承类中出现了虚函数,所以多了一个指向虚函数表的指针,而基类中一个虚函数都没有,所以也没有8、这个指针啦
5、数要设置成虚拟的,有些类虽然是基类,但是不是用于多态的,没有虚函数,没有被设计成允许经由基类接口派生类对象进行操作,那么也无需设成虚析构函数,毕竟增加了开销,好了,解释清楚了,我们也知道怎么做了,继续试验(3)保留CA中的虚析构函数修改main代码如下intmain(){ CB*p=newCC(); deletep; return0;}运行结果CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor取消CA中的虚析构函数,那么,CA,CB,CC中没有虚析构函数
6、那么3中代码运行结果如下CAconstructorCBconstructorCCconstructorCBdesstructorCAdesstructor只调到CB的析构哦,继续试验,CA,CB,CC中,只有CB是虚析构函数3中代码运行如下CAconstructorCBconstructorCCconstructorCCdesstructorCBdesstructorCAdesstructor所以,如果是CB指向派生类,只要CB或者其基类中存在虚析构函数,那么也是所有的析构函数都调用的了继续………………(4)修改main代码如下intmain(){ CA*p=n
7、ewCC(); deletep; return0;}如果A的析构函数是虚的,那么情况如2,不多说了如果是CA的析构函数不是虚的,而CB或者CC的析构函数是虚拟的,那么在调用deletep;会出现内存错误Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 是在释放内存的时候出现这样的错误上网查了一下,_BLOCK_TYPE_IS_VALID是用来检测内存有效性宏中的一个,这个错误说明指针使用出现了问题后来想了一想,应该是因为继承类中出现了虚函数,所以多了一个指向虚函数表的指针,而基类中一个虚函数都没有,所以也没有
8、这个指针啦
此文档下载收益归作者所有