@CrazyHenry
2018-02-20T13:15:41.000000Z
字数 1117
阅读 1453
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_yingmin@outlookdotcom- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
#include <iostream>#include <string>#include <vector>#include <iterator>#include <algorithm>#include <typeinfo>#include <numeric>#include <memory>using namespace std;//win+<-/-> 切换窗口位置//ctrl+win+<-/->切换桌面//ctrl+alt+上/下 改变显示器方向class Base{public:int *p;Base():p(new int(10)){cout<<"Base cons"<<endl;}virtual ~Base(){delete p;cout<<"Base des"<<endl;}};class Derv : public Base{public:int *pp;Derv():Base(),pp(new int(20)){cout<<"Derv cons"<<endl;}~Derv(){delete pp;cout<<"Derv des"<<endl;}};int main(){Base *bp = new Derv();cout<<*(bp->p)<<endl;cout<<"----------"<<endl;Derv *dp = static_cast<Derv*>(bp);cout<<*(dp->pp)<<endl;delete bp;bp = nullptr;dp = nullptr;return 0;}

注意,派生类的析构函数名和基类的析构函数名字不同。那么是否应该使用派生类的析构函数调用基类的析构函数呢?
答案是否定的,因为派生类的虚析构函数就是~Bulk_quote(),就是这个虚函数与基类的虚析构函数绑定,跳转就跳转到这里。
也就是说,delete itemP;会执行~Bulk_quote(),然后这个析构函数的函数体都执行之后,才会由编译器自动调用继承而来的~Base()。自己显式调用反而出错!
派生类的构造函数里可以写出基类的构造函数,也可以不写,不写的话基类部分将调用默认构造函数。
派生类的基类部分很多情况下都可以当成一个基类对象!比如构造和析构时的行为,基类指针与引用绑定的行为,以及友元的访问范围!

