C/C++中的虚析构函数和私有析构函数的使用
2016-05-17 14:26
344 查看
代码:
输出:
分析:
1、虚析构函数的作用:当基类指针指向派生类并delete时,可以调用派生类的析构函数;
2、私有析构函数的作用:令对象只能在堆上生成,即用new方法。原理是C++是一个静态绑定语言,在编译过程中,所有的非虚函数调用都必须分析完成(虚函数也要检查可访问性)。因此,当在栈上生成对象时,对象会自动析构,即析构函数必须可以访问。而在堆上生成对象时,析构步骤由程序员控制,不一定需要析构函数。同时,此生成对象不能直接delete删除,析构过程还需要一个专门的成员函数(代码中的destory()函数)。
虚析构函数与抽象类结合
代码:
输出:
#include <iostream> using namespace std; class A{ public: A(){ cout<<"construct A"<<endl; } virtual ~A(){ cout<<"destory A"<<endl; } }; class B:public A{ public: B(){ cout<<"construct B"<<endl; } ~B(){ cout<<"destory B"<<endl; } }; class C{ ~C(){ cout<<"destory C"<<endl; } public: C(){ cout<<"construct C"<<endl; } void destory(){ delete this; } }; int main(){ A* p = new B; delete p; C* p1 = new C;//new为在堆上分配空间 cout<<"new分配地址 "<<p1<<endl; //delete p1; //编译出错,不能直接delete p1->destory(); //C t; //编译出错,构造函数为私有的 A a; cout<<"不用new "<<&a<<endl; return 0; }
输出:
construct A construct B destory B destory A construct C new分配地址 0x1623c20 destory C construct A 不用new 0x7ffcb2ad25b0 destory A
分析:
1、虚析构函数的作用:当基类指针指向派生类并delete时,可以调用派生类的析构函数;
2、私有析构函数的作用:令对象只能在堆上生成,即用new方法。原理是C++是一个静态绑定语言,在编译过程中,所有的非虚函数调用都必须分析完成(虚函数也要检查可访问性)。因此,当在栈上生成对象时,对象会自动析构,即析构函数必须可以访问。而在堆上生成对象时,析构步骤由程序员控制,不一定需要析构函数。同时,此生成对象不能直接delete删除,析构过程还需要一个专门的成员函数(代码中的destory()函数)。
虚析构函数与抽象类结合
代码:
#include <iostream> #include <cstdio> using namespace std; class A{ public: //virtual ~A()=0; //如果抽象基类析构函数不需要实现,也可以用纯虚析构函数,但必须在类外加以声明 virtual ~A(){ cout<<"destory A"<<endl; } virtual void func()=0; }; //A::~A(){} class B:public A{ public: ~B(){ cout<<"destory B"<<endl; } //virtual void func()=0; //如果不实现纯虚函数,则必须重新说明,注意抽象类无法实例化 void func(){ cout<<"this is function"<<endl; } }; int main(int argc,char* argv[]){ A* pA = new B; delete pA; return 0; }
输出:
destory B destory A
相关文章推荐
- c++中vector的用法详解
- 魔方阵程序编写
- c++ geogle v8见解
- C++ 排列组合—N个数中取M个数
- 查看C语言的方法名
- C++ 查找本机安装word的版本号,
- <<Effective C++>>读书笔记5: 实现
- C#与C++(结构体内对象指定大小)
- 中文编译提示 Code::Blocks SVN6988学习增强版(适合C/C++初学者)
- C++类型转化详解—const_cast
- C++程序设计必知:多文件结构和编译预处理命令
- c++中的原子操作
- C++聚合关系类的构造函数的调用顺序详解
- C++中类型转换—static_cast,dynamic_cast,const_cast
- C++ 事件对象 多线程同步互斥
- 深入理解c++常成员函数和常对象
- C++ 信号量 多线程同步互斥
- 00_ubuntu下vim的c++补全
- Geekband C++面向对象高级编程(上) 第二周笔记 暗影行者
- 巧妙程序写法