C++ 类的多态四(虚析构函数的重要性)

//虚析构函数的重要性
#include<iostream>
using namespace std;
/*
虚析构函数
  主要用在多态中,用来释放子类对象内存空间,如果不使用虚析构函数,
  那么在多态的场景下,使用delete关键字只能执行父类析构函数

  子类对象中没有父类对象

  父类中有虚函数,子类中重写了该虚函数,那么默认子类中重写的函数也是虚函数,子类中不写也可以
  但是为了代码的可读性,还是在子类中也加上virtual 关键字
*/

class Point{
public:
    Point(int b=0){
        this->b = b;
    }
    virtual ~Point(){
        cout << "我是父类的析构函数!" << endl;
    }
private:
    int b;
};

class PointA :public Point{
public:
    virtual ~PointA(){
        cout << "我是子类的析构函数!" << endl;
    }
};

void ProtectA(Point *pin){
    //释放内存空间
    delete pin;
    //通过运行结果发现,如果不使用虚析构函数,那么传递过来的是子类对象
    //c++编译器也只会执行父类的析构函数  不会执行子类的析构函数
}

void ProtectB(){
    //在堆上分配内存空间
    PointA *pa = new PointA();
    ProtectA(pa);
}

void main(){
    ProtectB();
    system("pause");
}

时间: 2024-08-07 13:09:48

C++ 类的多态四(虚析构函数的重要性)的相关文章

C++多态中虚函数的深入理解

c++中动态多态性是通过虚函数来实现的.静态多态性是通过函数的重载来实现的,在程序运行前的一种早绑定,动态多态性则是程序运行过程中的一种后绑定.根据下面的例子进行说明. #include <iostream> #include <string> using namespace std; class Shape//形状类 { public: double calcArea() { cout<<"calcArea"<<endl; return

为什么必须提供纯虚析构函数的定义

转载:http://blog.chinaunix.net/uid-25544300-id-3236826.html 部分修改,感谢博主! 在 某些类里声明纯虚析构函数很方便.纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象).有些时候,你想使一个类成为抽象类,但刚好又没有 任何纯虚函数.怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明 一个纯虚析构函数. class awov { public: vi

C++ Primer 学习笔记33_面向对象编程(4)--虚函数与多态(一):多态、派生类重定义、虚函数的访问、 . 和-&gt;的区别、虚析构函数、object slicing与虚函数

C++ Primer学习笔记33_面向对象编程(4)--虚函数与多态(一):多态.派生类重定义.虚函数的访问. . 和->的区别.虚析构函数.object slicing与虚函数 一.多态 多态可以简单地概括为"一个接口,多种方法",前面讲过的重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法). 更通俗的说,多态行是指同一个操作作用于不同的对象就会产生不同的响应.或者说,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态行分

第六篇:为多态基类声明虚析构函数

前言 在很多类中,可以看到其析构函数都是声明为虚函数的. 那么,为何要将析构函数声明为虚函数?哪些情况要将析构函数声明为虚函数? 本文将为你解惑. 在使用 C++ 实现多态的时候,有一点一定要清楚:当派生类对象经由基类指针被删除,而此基类的析构函数没有被声明为虚函数的话,那么析构函数只会释放基类部分的成员而无视派生类成员. 如果不对这一点加以防范,那么很多时候,会带来内存泄露这样灾难性的后果. 问题描述 假设,有以下几个类,分别代表:钟,原子钟,水钟,腕表: 1 // 钟 2 class Tim

条款7:为多态的基类声明虚析构函数。

任何的类只要带有一个virtual函数那么就集合可以确定其应该有一个virtual析构函数. 同样的如果一个函数不含有virtual函数,那么通常意味着其不是一个基类函数,而且为一个不是基类的类声明virtual的析构函数是十分糟糕的事情,不要这样做.具体原因在下面: 1.首先,想要实现出virtual函数,对象必须要携带某些信息,.信息通过vptr来实现,这个vptr指向一个由函数指针构成的数组,即vtbl.盲目的去使用虚函数就会使得浪费资源.(一般人的经验是,只有当函数需要使用一个虚函数的时

EC笔记,第二部分:7.为多态基类声明虚析构函数

7.为多态基类声明虚析构函数 1.为多态基类声明虚析构函数 code1: class A{ public: int* a; A():a(new int(5)) {} ~A(){ delete a; } }; class B:public A { public: int *b; B():b(new int(10)) {} ~B(){ delete b; } }; int main(int argc, char const *argv[]) { B *bb=new B; A* aa=bb; dele

为多态基类声明虚析构函数

前言 在使用 C++ 实现多态的时候,有一点一定要清楚:当派生类对象经由基类指针被删除,而此基类的析构函数没有被声明为虚函数的话,那么析构函数只会释放基类部分的成员而无视派生类成员. 如果不对这一点加以防范,那么很多时候,会带来内存泄露这样灾难性的后果. 解决之道 1. 对于要拿来实现多态的基类,其析构函数一定要声明为虚函数. 也就是说,任何类只要带有虚函数,那么也几乎可以肯定其析构函数也要声明为虚函数. 2. 对于不用拿来当基类的类,或者拿来当基类但是不需要实现多态的类,则不要将析构函数声明为

为多态基类声明一个虚析构函数

使用一个基类指针删除派生类对象,同时基类的析构函数是非虚的,那么这个指针只会删除派生类对象中的基类的部分,其派生部分不会被删除.造成资源泄漏. 而如果一个类并不用作基类,则没必要把析构函数声明为虚的,否则会浪费空间来存储虚函数指针和虚函数表. STL容器并不含虚析构函数,因此最好不要继承STL容器. 只要有一个纯虚函数,就会导致抽象基类,即不能声明该基类的对象.抽象基类只能用来继承,纯虚函数如: virtual ~AWOV() = 0; 你必须为这个纯虚析构函数提供定义,因为析构函数调用时,最先

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函