@CrazyHenry
2018-02-20T21:15:41.000000Z
字数 1117
阅读 1087
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- 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()
。自己显式调用反而出错!
派生类的构造函数里可以写出基类的构造函数,也可以不写,不写的话基类部分将调用默认构造函数。
派生类的基类部分很多情况下都可以当成一个基类对象!比如构造和析构时的行为,基类指针与引用绑定的行为,以及友元的访问范围!