c++中虚析构函数

  当指向基类的指针指向新建立的派生类对象而且基类和派生类都调用new向堆申请空间时,必须将基类的析构函数声明为虚函数,从而派生类的析构函数也为虚函数,这样才能在程序结束时自动调用它,从而将派生类对象申请的空间归还给堆。

  附上一段代码诠释上述概念:

#include <iostream>
#include <string>
using namespace std;
class base{
    char *p;
public:
    base(int sz,char *bptr){
        p=new char[sz];
        strcpy(p,bptr);
        cout<<"constructor base"<<endl;
    }
    virtual ~base(){
        delete []p;
        cout<<"destructor base\n";
    }
};
class derive:public base{
    char *pp;
public:
    derive(int sz1,int sz2,char *bp,char *dptr):base(sz1,bp){
        pp=new char[sz2];
        strcpy(pp,dptr);
        cout<<"destructor derive\n";
    }
    ~derive(){
        delete []pp;
        cout<<"destructor derive\n";
    }
};
int main(){
    base *px=new derive(5,7,"base","derive");
    delete px;
    return 0;
}

  运行结果:

  如果不使用虚构函数,派生类动态申请的内存空间不能正常地退还给堆,程序的运行结果为:

#include <iostream>
#include <string>
using namespace std;
class base{
    char *p;
public:
    base(int sz,char *bptr){
        p=new char[sz];
        strcpy(p,bptr);
        cout<<"constructor base"<<endl;
    }
   ~base(){
        delete []p;
        cout<<"destructor base\n";
    }
};
class derive:public base{
    char *pp;
public:
    derive(int sz1,int sz2,char *bp,char *dptr):base(sz1,bp){
        pp=new char[sz2];
        strcpy(pp,dptr);
        cout<<"destructor derive\n";
    }
    ~derive(){
        delete []pp;
        cout<<"destructor derive\n";
    }
};
int main(){
    base *px=new derive(5,7,"base","derive");
    delete px;
    return 0;
}

特殊地,抽象类中的纯析构函数必须定义为:

virtual ~shape()=0

{}                          //大话号{}不能省略

时间: 2024-10-30 16:24:05

c++中虚析构函数的相关文章

C++中虚析构函数的作用 .

我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类: class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };}; class Cl

C++中虚析构函数的作用 (转载)

转自:http://blog.csdn.net/starlee/article/details/619827 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类: class ClxBase { public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something i

虚析构函数

简单来说析构函数就是回收站.若系统不及时去回收这些垃圾(通常是无用的内存资源),那么时间越久肯定会有越来越多的垃圾.在开相同的程序,有时候手机和电脑重启了一下,速度会明显变快很多.因为RAM中的资源掉电后就释放了. 在C++中,析构函数就是释放无用资源的.在派生类中,假设用基类指针指向了一个派生类的临时变量.那么会发生什么情况.实际上这个时候只会释放基类的无用资源而没有释放这个临时的派生类的资源. #include<iostream> usingnamespacestd; classPoint

C++中的虚析构函数、纯虚析构函数详解

C++中析构函数可以为纯虚函数吗? 众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用.那么析构函数是否可以设为纯虚呢? class CBase { public: CBase() { printf("CBase()\n"); } virtual ~CBase() = 0; // 析构函数是纯虚函数 }; 答案是可以,那么这样实现的目的是什么呢?当然是避免实例化. 但因为派生类不可能来实现基类的析构函数,所以基类析构函数虽然

C++继承中析构函数 构造函数的调用顺序以及虚析构函数

首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,仅仅有这样子类才干在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数.通俗点说,你要用某些物品.但这些物品你没办法自己生产,自然就要等别人生产出来,你才干拿来用. 接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会仅仅存在子类中直到子类调

C++中基类的析构函数为什么要用virtual虚析构函数

知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏.具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数.那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏

C++中基类虚析构函数的作用及其原理分析

虚析构函数的理论前提是 执行完子类的析构函数,那么父类的虚构函数必然会被执行. 那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏. 故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual. 知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual

第六篇:为多态基类声明虚析构函数

前言 在很多类中,可以看到其析构函数都是声明为虚函数的. 那么,为何要将析构函数声明为虚函数?哪些情况要将析构函数声明为虚函数? 本文将为你解惑. 在使用 C++ 实现多态的时候,有一点一定要清楚:当派生类对象经由基类指针被删除,而此基类的析构函数没有被声明为虚函数的话,那么析构函数只会释放基类部分的成员而无视派生类成员. 如果不对这一点加以防范,那么很多时候,会带来内存泄露这样灾难性的后果. 问题描述 假设,有以下几个类,分别代表:钟,原子钟,水钟,腕表: 1 // 钟 2 class Tim

C++虚析构函数

在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了. 析构函数则用于销毁对象时完成相应的资源释放工作,析构函数可以被声明为虚函数.我们先通过一个例子来说明析构函数声明为虚函数的必要性. 例1: #include<iostream>using namespace std; class base{public: base(); ~base();private