面试时被问到了虚析构函数的使用,特此记录
首先我们写两个类:
#ifndef CLX_H #define CLX_H #include <iostream> class ClxBase { public: ClxBase() {std::cout << "clx_base has been created" << std::endl;} virtual ~ClxBase() {std::cout << "clx_base has been destroyed" << std::endl;} virtual void dosomething() {std::cout << "clx_base dosomething..." << std::endl;} }; class ClxDerived : public ClxBase { public: ClxDerived() {std::cout << "clx_derived has been created" << std::endl;} ~ClxDerived(){std::cout << "clx_derived has been destroyed" << std::endl;} void dosomething() {std::cout << "clx_derived dosomething..." << std::endl;} }; #endif
指明了,父类的析构函数是虚类型。
调用代码:
ClxBase *clx = new ClxDerived; clx->dosomething(); delete clx;
运行结果如下:
注意类加载时的顺序和析构的顺序是刚好相反的。析构是总是从子类开始,然后再回收父类,符合编程要求。
如果将父类中规定的虚类型去掉,即
class ClxBase { public: ClxBase() {std::cout << "clx_base has been created" << std::endl;} ~ClxBase() {std::cout << "clx_base has been destroyed" << std::endl;} virtual void dosomething() {std::cout << "clx_base dosomething..." << std::endl;} };
这样,只会执行基类的析构函数,而派生类的析构函数不会执行。 相当于没有重载。
运行效果如下:
当基类的析构函数为虚函数时,无论指针指的是同一类族中的哪一个类对象,系统会采用动态关联,调用相应的析构函数,对该对象进行清理工作。
如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。
最好把基类的析构函数声明为虚函数。这将使所有派生类的析构函数自动成为虚函数。这样,如果程序中显式地用了delete运算符准备删除一个对象,而delete运算符的操作对象用了指向派生类对象的基类指针,则系统会调用相应类的析构函数。
虚析构函数的概念和用法很简单,但它在面向对象程序设计中却是很重要的技巧。
专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。
构造函数不能声明为虚函数。这是因为在执行构造函数时类对象还未完成建立过程,当然谈不上函数与类对象的绑定。
相关推荐
虚析构函数示例 c++析构函数是否是虚函数时的差别,敬请留意
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:
该资源的内容主要是 虚基类 虚函数成员 虚析构函数的具体的区别
详细解释了为什么析构函数可以是虚函数,而构造函数不能是虚函数
C++中基类的析构函数为什么要用virtual虚析构函数.pdf
构造函数不能声明为虚函数,析构函数可以声明为虚函数。
C++析构函数使用virtual的原因
虚析构函数 析构函数的工作方式是:底层的派生类(most derived class)的析构函数先被调用,然后调用每一个基类的析构函数。 因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非...
本文给大家分享了避免析构函数调用虚函数。
c++ virtual 虚析构函数及虚函数的详细例子.rar
//析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...
C++中析构函数定义成虚函数的原因 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2009/03/12/3985341.aspx
C_虚构造函数和虚析构函数.pdf
本文给大家介绍了C++中确定基类有虚析构函数的方法。
主要介绍了C++中虚析构函数的作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
自己下的一个调用派生析构函数的程序,希望大家互相学习啊。
析构函数的作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1、析构函数名是在类名前加以符号“~”。 2、析构函数没有参数、返回类型和修饰符。 3、一个类中至多有一个析构函数,如果程序员...
在C++中,不能声明虚构造函数,但可以声明虚析构函数。多态性是指不同的对象对同一消息有不同的行为特性。虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有...
本篇文章是对C++中虚析构函数的作用进行了详细的分析介绍,需要的朋友参考下