关于虚析构函数作用示例.
首先是一个main方法驱动头文件如下:
#include "TestVirtualDestructor.h"
int main() {
Person *person = new Student;
delete person;
return 0;
}
/**
* 输出结果:
*
*1.没有使用虚析构函数的时候的输出:子类的析构函数没有调用.
调用Person的构造函数.
调用Student的构造函数.
调用Person的析构函数.
*/
相关的类文件如下:
/*
* TestVirtualDestructor.h
*
* Created on: 2011-10-12
* Author: banxi1988
*/
#include "common.h"
class Person{
public:
Person(){
cout<<"调用Person的构造函数."<<endl;
};
~Person(){
cout<<"调用Person的析构函数."<<endl;
}
};
class Student:public Person{
public:
Student(){
ptr = new int;
cout<<"调用Student的构造函数."<<endl;
}
~Student(){
delete ptr;
cout<<"调用Student的析构函数."<<endl;
}
private:
int *ptr;
};
这个时候的输出结果,可以很明显的看出没有调用子类的析构函数.
而在子类也而在删除person实例时,其实需要释放它在堆上生成的一个ptr.
.
我们将~Person声明为virtual ~Person之后运行结果如下:
/**
*
调用Person的构造函数.
调用Student的构造函数.
调用Student的析构函数.
调用Person的析构函数.
*/
所以析构函数,还是用虚的总是好的.
所以代码重构如下:
/*
* TestVirtualDestructor.h
*
* Created on: 2011-10-12
* Author: banxi1988
*/
#include "common.h"
class Person{
public:
Person(){
cout<<"调用Person的构造函数."<<endl;
};
virtual ~Person(){
cout<<"调用Person的析构函数."<<endl;
}
};
class Student:public Person{
public:
Student(){
ptr = new int;
cout<<"调用Student的构造函数."<<endl;
}
virtual ~Student(){
delete ptr;
cout<<"调用Student的析构函数."<<endl;
}
private:
int *ptr;
};
分享到:
相关推荐
这些文件可能包含了关于虚析构函数的示例代码,演示如何在实际项目中使用它们。通常,`test_virtual_fun.h`会定义类结构,而`test_virtual_fun.cpp`则会实现这些类的方法,包括构造函数和析构函数,并进行一些测试...
在C++编程语言中,虚基类、虚函数成员和虚析构函数是面向对象编程中的关键概念,它们对于理解和实现多态性至关重要。多态性允许我们编写更灵活、可扩展的代码,使得程序能处理多种不同类型的对象。下面将详细解释这...
C++ 中基类的析构函数为什么要用 virtual 虚析构函数 C++ 中基类的析构函数为什么要用 virtual 虚析构函数?这是一个非常重要的问题。在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏...
C++中虚析构函数的作用及其原理分析 C++中的虚析构函数是一种特殊的析构函数,用于避免内存泄露和防止内存泄露。当子类中有指针成员变量时,虚析构函数可以确保在删除基类指针时调用子类的析构函数,以释放子类中的...
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. **提高代码健壮性和可维护性**:对于大型项目来说,良好的设计习惯至关重要。将基类的析构函数声明为虚函数可以减少未来...
在有继承层次结构的类中,基类的析构函数通常是虚函数(`virtual`),以确保即使通过基类指针或引用删除派生类对象时,也能调用正确的析构函数。例如: ```cpp class Base { public: virtual ~Base() { // 基类析...
### C++箴言:避免析构函数调用虚函数 #### 概述 在C++编程中,理解和遵循良好的设计模式对于确保程序的稳定性和可维护性至关重要。其中一个经常被提及的原则是“避免在析构函数中调用虚函数”。这一原则在C++语言...
3. **声明虚析构函数:** 如果一个类有可能被继承,则应该声明虚析构函数,以确保正确的析构顺序。 4. **遵循RAII原则:** 使用资源获取即初始化(Resource Acquisition Is Initialization, RAII)的设计模式,利用...
6. **可以是虚函数**:如果希望在派生类中覆盖基类的析构函数,则可以在基类中声明析构函数为虚函数。 #### 三、示例代码解析 下面通过给出的代码示例来详细了解析构函数的应用: ```cpp #include using ...
本文将深入探讨虚析构函数的作用,以及为何在基类中声明虚析构函数是必要的。 首先,让我们理解什么是析构函数。析构函数是C++中的特殊成员函数,其作用是在对象生命周期结束时自动执行,用于清理对象占用的资源,...
- 示例2(非虚析构函数,基类指针操作派生类): 这个例子与前一个类似,但使用了基类指针`p`来操作派生类`Derived`的对象。由于基类析构函数非虚,只有`Base`的析构函数被调用,`Derived`的析构函数被忽略,导致...
总结一下,虚析构函数的主要作用在于保证多态性下的正确对象销毁,只应在基类中声明虚析构函数,当类设计为基类并可能有派生类时。不要无谓地增加所有类的析构函数的虚性,以避免不必要的性能和内存开销。理解这一点...
### C++与操作系统等面试题50:程序员定义的析构函数被扩展的过程 #### 析构函数的概念 在C++编程语言中,析构函数是一种...在涉及多态性时,特别需要注意虚析构函数的重要性,以确保所有派生类资源得到妥善释放。
**虚析构函数**:当类层次结构中涉及多态性时,需要使用虚析构函数。如果基类的析构函数不是虚的,而你通过基类指针删除一个派生类对象,可能会导致只有基类的析构函数被调用,而派生类的析构函数不会被调用,这可能...
这是因为虚析构函数允许动态绑定,使得在多态环境中,通过基类指针调用析构函数时,实际上是调用了相应派生类的析构函数。如果基类的析构函数不是虚函数,那么仅会调用基类的析构函数,而派生类的析构函数不会被执行...
如果不声明为虚析构函数,只有基类的析构函数会被调用,这可能导致资源泄漏。 关于析构函数的一些最佳实践: 1. **析构函数不应抛出异常**:如果析构函数可能引发异常,应在内部捕获并处理,因为析构函数抛出异常...