我们知道,用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++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
相关推荐
在C++编程中,虚析构函数是一个至关重要的概念,特别是在处理对象的继承和多态性时。本文将深入探讨虚析构函数的作用、工作原理以及何时需要使用它。 首先,我们来理解什么是析构函数。析构函数是C++中的一个特殊...
C++中虚析构函数的作用及其原理分析 C++中的虚析构函数是一种特殊的析构函数,用于避免内存泄露和防止内存泄露。当子类中有指针成员变量时,虚析构函数可以确保在删除基类指针时调用子类的析构函数,以释放子类中的...
C++ 中基类的析构函数为什么要用 virtual 虚析构函数 C++ 中基类的析构函数为什么要用 virtual 虚析构函数?这是一个非常重要的问题。在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏...
在C++编程语言中,虚基类、虚函数成员和虚析构函数是面向对象编程中的关键概念,它们对于理解和实现多态性至关重要。多态性允许我们编写更灵活、可扩展的代码,使得程序能处理多种不同类型的对象。下面将详细解释这...
虚析构函数的必要性 在 C++ 编程中,析构函数是一个非常重要的概念,它负责释放对象所占用的资源并销毁对象。然而,析构函数可以是虚函数,而构造函数不能是虚函数,这是为什么呢?今天我们就来详细解释这个问题。 ...
当通过基类指针或引用调用虚析构函数时,会调用对应的派生类析构函数,实现了多态性。 3. **提高代码健壮性和可维护性**:对于大型项目来说,良好的设计习惯至关重要。将基类的析构函数声明为虚函数可以减少未来...
1. **动态类型与静态类型不匹配**:在析构函数中调用虚函数时,C++使用的是静态绑定,即根据对象的静态类型(即编译时已知的类型)来决定调用哪个函数版本,而不是动态类型(即运行时的实际类型)。因此,即使你期望...
总结来说,C++中的虚析构函数主要作用在于: 1. 确保通过基类指针删除派生类对象时,能调用到派生类的析构函数,避免内存泄漏。 2. 支持多态性,允许基类指针执行派生类的析构逻辑。 3. 确保派生类中新增的资源在...
} // 非虚析构函数 private: char* ptr_a_; }; class B : public A { public: B() { ptr_b_ = new char[20]; } ~B() { delete[] ptr_b_; } // 派生类的析构函数 private: char* ptr_b_; }; void foo() { A* ...
3. **声明虚析构函数:** 如果一个类有可能被继承,则应该声明虚析构函数,以确保正确的析构顺序。 4. **遵循RAII原则:** 使用资源获取即初始化(Resource Acquisition Is Initialization, RAII)的设计模式,利用...
2. **动态绑定的正确性**:在类的继承体系中,通过虚析构函数可以确保动态绑定正确地执行。当通过基类指针删除派生类对象时,动态绑定机制将识别到实际类型并调用相应的析构函数。 3. **代码可扩展性和安全性**:...
在C++编程语言中,析构函数是一种特殊类型的成员函数,它的主要职责是释放对象在创建过程中分配的资源。当你创建一个类,并为类的对象分配内存时,可能会涉及到动态内存分配或其他需要清理的工作,比如关闭文件、...
在C++编程语言中,虚函数(Virtual Functions)和虚析构函数(Virtual Destructors)是面向对象编程中的重要概念,特别是在处理继承和多态性时显得尤为关键。本资料详细介绍了这两个主题,并通过实例进行了深入讲解...
C++中,有两种类型的析构函数:非虚析构函数和虚析构函数。对于基类,如果基类的析构函数声明为虚的(`virtual`),那么通过基类指针或引用删除派生类对象时,将调用正确的派生类析构函数,这是多态性的体现。不声明...
虚析构函数 析构函数的工作方式是:底层的派生类(most derived class)的析构函数先被调用,然后调用每一个基类的析构函数。 因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非...
//析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...
6. **可以是虚函数**:如果希望在派生类中覆盖基类的析构函数,则可以在基类中声明析构函数为虚函数。 #### 三、示例代码解析 下面通过给出的代码示例来详细了解析构函数的应用: ```cpp #include using ...