`
蒙面考拉
  • 浏览: 160576 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

析构函数为虚函数的原因

 
阅读更多

  我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:    
    有下面的两个类:

class ClxBase
{
public:
    ClxBase() {};
    
virtual ~ClxBase() {};

    
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; };
};

    代码

ClxBase *pTest = new ClxDerived;
pTest
->DoSomething();
delete pTest;

    的输出结果是:

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

    这个很简单,非常好理解。
    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:

Do something in class ClxDerived!

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

分享到:
评论

相关推荐

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

    在类的继承体系中,基类的析构函数可以声明为虚函数,这样做的主要原因如下: 1. **避免内存泄漏**:如果基类指针指向派生类对象,并且基类的析构函数不是虚函数,那么通过基类指针删除派生类对象时,只会调用基类...

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

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

    虚析构函数示例

    在继承体系中,如果没有声明析构函数为虚的,那么通过基类指针或引用删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能会导致资源泄露和其他未定义行为。而声明了虚析构函数后,系统会...

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

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

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

    ### C++中析构函数定义成虚函数的原因 在C++编程中,为了实现多态性,虚函数机制被广泛采用。然而,在某些特定场景下,尤其是涉及到派生类和基类之间的对象管理时,将析构函数声明为虚函数显得尤为重要。本文将深入...

    为何要虚析构函数.docx

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

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

    虚函数、虚析构函数都是动态绑定的基础。 在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏。为什么?因为当我们使用基类指针指向派生类对象时,如果基类的析构函数不是 virtual 的,...

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

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

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

    如果这些类型还涉及多态,即作为其他类的基类,那么为了确保资源的正确释放,基类的析构函数应当声明为虚函数。 3. **一致性原则** 如果一个类提供了至少一个虚函数,意味着它可能用于多态性场景,此时其析构函数...

    析构函数应用

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

    深析C++析构函数

    5. **可以是虚函数:** 如果类中包含虚函数,则析构函数也应声明为虚函数,以确保派生类的析构函数也能被正确调用。 #### 二、析构函数与资源管理 **资源管理的重要性:** 资源管理是程序设计中极其重要的环节之一...

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

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

    派生的析构函数被调用

    在C++编程中,析构函数是一个特殊类型的成员函数,用于清理对象在创建时分配的资源。当对象的生命周期结束...在MFC环境中,这一点尤为重要,因为MFC类库中大量的类都依赖于正确的析构函数调用来维护系统资源的完整性。

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

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

    C++析构函数 快速学习

    不声明为虚析构函数可能导致只调用了基类的析构函数,而忽略了派生类的析构函数,这是一种常见的错误。 此外,析构函数可以重载,就像普通成员函数一样。但要注意,析构函数的重载并不意味着它们会自动被调用,你...

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

    虚析构函数的作用可以总结为以下两点: 1. 如果父类的析构函数不加virtual关键字,当父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。 2. 如果父类的析构函数加virtual...

    浅谈C++基类的析构函数为虚函数

    1、原因:  在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类。 2、例子:  (1)、    #include  using namespace std;  class Base{  public: Base() {};  ~Base() {...

    析构函数的作用 什么是析构函数

    定义析构函数格式为: ~类名() {…}  由于c#得到自动内存管理的支持,当对象生命期结束后,系统能够自动回收那些对象应该释放的资源等,所以一般不需要程序员的关心,对于一般的对象,程序中不需要定义析构函数...

Global site tag (gtag.js) - Google Analytics