虚析构函数

原创 2018年04月17日 10:04:44
#include<iostream>
using namespace std;

class A
{
public:
    A()
    {
         cout << "A()..." << endl;
         this->p = new char[64];
         memset(this->p,0,64);//清空数组
         strcpy(this->p,"A String...");
    }

    virtual void print()
    {
        cout << "A:" << this->p << endl;
    }

    virtual ~A() {//虚析构函数
        cout << "~A()..." << endl;
        if (this->p != NULL) {
            delete[] this->p;
            this->p = NULL;
        }
    }
private:
    char *p;
};

class B :public A
{
public:
    B()
    {//此刻一定会触发A的无参构造
         cout << "B()..." << endl;
         this->p = new char[64];
         memset(this->p,0,64);//清空数组
         strcpy(this->p,"B String...");
    }

    virtual void print()
    {
        cout << "B:" << this->p << endl;
    }

    virtual ~B()
    {
        cout << "~B()..." << endl;
        if (this->p != NULL) {
            delete[] this->p;
            this->p = NULL;
        }
    }

private:
    char *p;
};

void func(A *ap)
{
    ap->print();//在此发生多态

    delete ap;//要使此刻ap-> ~B(),~B()再自动触发~A()
            //即让此刻产生多态,要使用虚析构函数,
            //不然系统默认触发~A(),不再触发~B(),会发生内存泄漏
}

void test()
{
    A *ap = new A;
    func(ap);
    cout << "-------------"<< endl;

    B *bp = new B;
    func(bp);
}
int main()
{
    test();   
    return 0;
}

总结:

void func(A *ap)
  {
    ap->print();//在此发生多态

    delete ap;//要使此刻ap-> ~B(),~B()再自动触发~A()
        //即让此刻产生多态,要使用虚析构函数,
        //不然系统默认触发~A(),不再触发~B(),会发生内存泄漏
版权声明:如需转载,请注明出处。 https://blog.csdn.net/Young__Fan/article/details/79970596

大家来做 RPM

大家来做 RPM 作者:不详 ○、前言-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-打造属於自己的作业系统环境,这应该是许多 Linux 玩...
  • x86
  • x86
  • 2000-12-21 18:08:00
  • 1065

虚析构函数的实现原理

虚析构函数的理论前提是执行完子类的析构函数,那么父类的虚构函数必然会被执行。那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义析构函数,那么将只会调用父类的析构函数,而不会调用子类...
  • qq_23225317
  • qq_23225317
  • 2016-10-14 22:28:11
  • 1563

虚析构函数的使用(转载!)

一、当你的类准备给别人继承时要提供虚析构函数考虑下面例子:class A{public: A(){cout  ~A(){cout };class B : publi...
  • cffy625
  • cffy625
  • 2010-01-22 17:21:00
  • 12046

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

参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的...
  • derkampf
  • derkampf
  • 2017-03-15 00:13:04
  • 2934

个人对继承理解以及虚析构函数的理解

今天又从新研究了下继承和重载,感觉又有新的体会。         首先是对继承的理解,继承简单的说就是把基类的东西保留下来(一般都是public继承,这样基类中的public成员继承过来后还是pub...
  • Leeboy_Wang
  • Leeboy_Wang
  • 2012-02-26 20:47:00
  • 1906

C++学习之多态篇(虚函数和虚析构函数的实现原理--虚函数表)

通过下面的代码来说明: #include #include #include using namespace std; /**  *  定义动物类:Animal  *  成员函数:eat()...
  • hudfang
  • hudfang
  • 2016-01-26 18:13:55
  • 1899

什么时候要用虚析构函数?

 什么时候要用虚析构函数?通过基类的指针来删除派生类的对象时,基类的析构函数应该是虚的。否则其删除效果将无法实现。一般情况下,这样的删除只能够删除基类对象,而不能删除子类对象,形成了删除一半形象,从而...
  • redhat7890
  • redhat7890
  • 2009-11-16 17:21:00
  • 4783

基类的纯虚析构函数一定要予以实现

纯虚函数 纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。 虚函数是C++语言的精髓。含有纯...
  • friendbkf
  • friendbkf
  • 2015-05-17 18:59:49
  • 2395

纯虚析构函数必须给出定义

Effective C++ 条歀07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes) 纯虚函数...
  • wl1070325332
  • wl1070325332
  • 2017-03-08 17:18:48
  • 444

关于虚析构函数的作用和使用

作用:作为基类使用的类应该具有虚析构函数,以保证在删除基类指针(动态分配的对象)时,根据指针实际指向的对象进行适当的析构。 请看下面这段代码; #include class A{ publi...
  • wangbin_jxust
  • wangbin_jxust
  • 2014-10-15 14:59:43
  • 876
收藏助手
不良信息举报
您举报文章:虚析构函数
举报原因:
原因补充:

(最多只允许输入30个字)