`
隐形的翅膀
  • 浏览: 498185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++析构函数为什么要为虚函数

 
阅读更多
1.为什么基类的析构函数是虚函数?

  在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。

  下面转自网络:源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html

  a.第一段代码

#include<iostream>
using namespace std;
class ClxBase{
public:
    ClxBase() {};
    ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};

    void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase{
public:
    ClxDerived() {};
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };

    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
  int   main(){  
  ClxDerived *p =  new ClxDerived;
  p->DoSomething();
  delete p;
  return 0;
  }


  运行结果:

  Do something in class ClxDerived!           

  Output from the destructor of class ClxDerived!

  Output from the destructor of class ClxBase! 

  这段代码中基类的析构函数不是虚函数,在main函数中用继承类的指针去操作继承类的成员,释放指针P的过程是:先释放继承类的资源,再释放基类资源.

  b.第二段代码

#include<iostream>
using namespace std;
class ClxBase{
public:
    ClxBase() {};
    ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};

    void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase{
public:
    ClxDerived() {};
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };

    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; }
};
  int   main(){  
  ClxBase *p =  new ClxDerived;
  p->DoSomething();
  delete p;
  return 0;
  } 


  输出结果:

  Do something in class ClxBase!
  Output from the destructor of class ClxBase!

    这段代码中基类的析构函数同样不是虚函数,不同的是在main函数中用基类的指针去操作继承类的成员,释放指针P的过程是:只是释放了基类的资源,而没有调用继承类的析构函数.调用  dosomething()函数执行的也是基类定义的函数.

    一般情况下,这样的删除只能够删除基类对象,而不能删除子类对象,形成了删除一半形象,造成内存泄漏.

    在公有继承中,基类对派生类及其对象的操作,只能影响到那些从基类继承下来的成员.如果想要用基类对非继承成员进行操作,则要把基类的这个函数定义为虚函数.

    析构函数自然也应该如此:如果它想析构子类中的重新定义或新的成员及对象,当然也应该声明为虚的.



  c.第三段代码:
#include<iostream>
using namespace std;
class ClxBase{
public:
    ClxBase() {};
    virtual ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};
    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase{
public:
    ClxDerived() {};
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};

  int   main(){  
  ClxBase *p =  new ClxDerived;
  p->DoSomething();
  delete p;
  return 0;
  }  

  运行结果:

  Do something in class ClxDerived!
  Output from the destructor of class ClxDerived!
  Output from the destructor of class ClxBase!

    这段代码中基类的析构函数被定义为虚函数,在main函数中用基类的指针去操作继承类的成员,释放指针P的过程是:只是释放了继承类的资源,再调用基类的析构函数.调用dosomething()函数执行的也是继承类定义的函数. 

    如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.
分享到:
评论

相关推荐

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

    只有当一个类被用来作为基类时,才需要将析构函数设置为虚函数。这是因为虚函数表会增加类的存储空间,所以我们需要根据实际情况进行判断。 虚析构函数在C++中起着非常重要的作用,它可以确保资源的正确释放,避免...

    C++中析构函数定义成虚函数的原因.doc

    本文将深入探讨为何在C++中推荐将析构函数定义为虚函数。 #### 析构函数与虚函数的基本概念 - **析构函数**:在C++中,析构函数是一种特殊的成员函数,用于在对象生命周期结束时释放资源或执行必要的清理工作。析...

    构造函数不能声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数主要是因为构造过程中对象的动态类型尚未确定,而析构函数可以声明为虚函数以确保正确释放资源并避免内存泄漏等问题。理解这些基本原则对于编写高质量、健壮的C++程序至关重要。

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

    C++ 中基类的析构函数为什么要用 virtual 虚析构函数 C++ 中基类的析构函数为什么要用 virtual 虚析构函数?这是一个非常重要的问题。在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏...

    深析C++析构函数

    ### 深析C++析构函数 在C++编程语言中,析构函数是一个非常重要的概念,同时也是很多初学者容易感到困惑的地方。本文将详细探讨C++中的析构函数,帮助读者更好地理解和掌握这一核心知识点。 #### 一、析构函数的...

    C++箴言:避免析构函数调用虚函数

    ### C++箴言:避免析构函数调用虚函数 #### 概述 在C++编程中,理解和遵循良好的设计模式对于确保程序的稳定性和可维护性至关重要。其中一个经常被提及的原则是“避免在析构函数中调用虚函数”。这一原则在C++语言...

    C++ 析构函数 参考源代码

    virtual ~Base() { // 基类析构函数声明为虚函数 // ... } }; class Derived : public Base { public: ~Derived() override { // 派生类析构函数 // ... } }; ``` 总的来说,析构函数是C++中进行资源管理的...

    C++析构函数使用virtual的原因

    在C++编程语言中,析构函数的作用是在对象生命周期结束时释放资源,如动态分配的内存、文件句柄等。然而,当涉及到继承体系时,析构函数的行为变得尤为重要,尤其是在多态性上下文中。使用`virtual`关键字声明析构...

    虚析构函数示例

    在C++编程中,虚析构函数是一个至关重要的概念,特别是在处理对象的继承和多态性时。本文将深入探讨虚析构函数的作用、工作原理以及何时需要使用它。 首先,我们来理解什么是析构函数。析构函数是C++中的一个特殊...

    为何要虚析构函数.docx

    然而,析构函数可以是虚函数,而构造函数不能是虚函数,这是为什么呢?今天我们就来详细解释这个问题。 首先,让我们来看一下为什么析构函数需要是虚函数。如果析构函数不是虚的,那么将只调用对应于指针类型的析构...

    虚基类 虚函数成员 虚析构函数

    在C++编程语言中,虚基类、虚函数成员和虚析构函数是面向对象编程中的关键概念,它们对于理解和实现多态性至关重要。多态性允许我们编写更灵活、可扩展的代码,使得程序能处理多种不同类型的对象。下面将详细解释这...

    C++析构函数 快速学习

    总之,理解和掌握C++析构函数对于编写高效、安全的代码至关重要。它们是C++内存管理的重要工具,能够帮助你避免内存泄漏和悬垂指针等问题。在实际编程中,合理使用析构函数和智能指针可以极大地提升代码质量,降低...

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

    C++中虚析构函数的作用及其原理分析 C++中的虚析构函数是一种特殊的析构函数,用于避免内存泄露和防止内存泄露。当子类中有指针成员变量时,虚析构函数可以确保在删除基类指针时调用子类的析构函数,以释放子类中的...

    c++虚析构函数及虚函数的详细例子.rar

    在C++编程语言中,虚函数(Virtual Functions)和虚析构函数(Virtual Destructors)是面向对象编程中的重要概念,特别是在处理继承和多态性时显得尤为关键。本资料详细介绍了这两个主题,并通过实例进行了深入讲解...

    析构函数应用

    6. **可以是虚函数**:如果希望在派生类中覆盖基类的析构函数,则可以在基类中声明析构函数为虚函数。 #### 三、示例代码解析 下面通过给出的代码示例来详细了解析构函数的应用: ```cpp #include using ...

    派生的析构函数被调用

    在C++编程中,析构函数是一个特殊类型的成员函数,用于清理对象在创建时分配的资源。当对象的生命周期结束时,析构函数会被自动调用。标题“派生的析构函数被调用”涉及的是面向对象编程中的继承概念,特别是在多态...

    C++虚基类 虚函数 虚析构函数

    //析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...

    C++虚析构函数、纯虚析构函数

     因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这导致了一...

    用C++实现虚函数

    本文将深入探讨如何使用C++实现虚函数,包括虚函数的基本用法、虚析构函数的概念以及如何计算类的大小。 首先,虚函数的声明是在基类的定义中完成的,通过在函数声明前加上`virtual`关键字。例如: ```cpp class ...

Global site tag (gtag.js) - Google Analytics