一个类做为基类时,如果有析构函数,则析构函数必须是虚析构函数
2013-05-24 16:54
288 查看
当一个类需要分配动态内存时就必须定义类析构函数。如果类被用作基类,则析构函数必须是虚析构函数。这是我们要通过基类指针维护对象表时必须要考虑的细微但重要的一点,如果基类的析构函数不是虚函数,则用基类指针指向的派生类对象的析构函数得不到执行,那么有派生类所生成的动态数据将得不到释放。
请看下面的例子:
假设p是一个BasedCL类的指针,但被指向了一个动态的DeriverCL对象,我们调用delete函数:
由于派生类所生成的动态数据将不会被释放。如果基类的析构函数被声明成虚函数,那么派生类的析构函数将被调用。这种情况下也要调用基类的析构函数,但要等到派生类析构函数被调用之后。
请看下面的例子:
class BasedCL { ... public: BasedCL(...) ; //申请7个元素的数组 ~BasedCL() ; //释放空间(非虚函数) }; 类DerivedCL继承BasedCL类并执行同样的操作: class DerivedCL : public BasedCL { ... public: DerivedCL(...) ; //申请7个元素的数组 ~DerivedCL() ; //释放空间(非虚函数) };
假设p是一个BasedCL类的指针,但被指向了一个动态的DeriverCL对象,我们调用delete函数:
BasedCL *p = new DerivedCL() ; //建立一个DeriverCL对象 delete p ; //调用基类的析构函数
由于派生类所生成的动态数据将不会被释放。如果基类的析构函数被声明成虚函数,那么派生类的析构函数将被调用。这种情况下也要调用基类的析构函数,但要等到派生类析构函数被调用之后。
相关文章推荐
- C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
- 虚析构函数问题:为什么要将基类的的析构函数设成虚的?
- 为什么基类的析构函数必须为虚函数的原因-个人理解
- 字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。如果字符串参数包含了任何非数字字符,函数就返回零
- 为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?
- 这个字符串参数必须包含一个或多个数字,函数应该把这些 数字字符转换为整数并返回这个整数。如果字符串参数包含 了任何非数字字符,函数就返回零。
- C++中基类的析构函数为什么要用virtual虚析构函数
- 错误:每个配置文件中只允许存在一个 元素,并且,如果存在该元素,它还必须是根 元素的第一个子元素
- C++中基类的析构函数为什么要用virtual虚析构函数
- 构造函数不能是虚函数 基类析构函数必须为虚函数
- 必须为多态基类声明 virtual 析构函数
- 错误:每个配置文件中只允许存在一个 元素,并且,如果存在该元素,它还必须是根 元素的第一个子元素
- C++中基类的析构函数为什么要用virtual虚析构函数
- c++如果定义了析构函数,则必须有析构函数的函数体,那怕是空的也行,如果没有定义析构函数,则会调用默认的析构函数
- swift中一个类定义一个属性必须初始化,如果不想初始化可以加?
- 基类析构函数必须为虚函数否则会造成内存泄漏
- 虚析构函数问题:为什么要将基类的的析构函数设成虚的?
- 为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。如果字符串参数
- C++中基类的析构函数为什么要用virtual虚析构函数
- 如果要保存的话就必须得一个一个New,因为new一次产生一个id,如果只是在循环外面new是不行的,因为Id是同一个