虚析构函数

来源:互联网 发布:sqlserver 循环语句 编辑:程序博客网 时间:2024/05/16 12:45

多态:

字面意思:多种形态,在编程中指的是同样的消息(成员函数等)被不同的对象接受时导致的完全不相同的行为的一种现象。

联编:

确定程序中操作与执行该操作的代码段之间的映射关系。(简单来说就是你妈说你可以吃糖,联翩就是绑定你吃的是哪种糖,硬糖还是软糖)

多态的分类:

编译时多态:通过静态联编,也叫早期绑定,在编译阶段进行。

现象:函数重载和操作符重载,隐藏等。

运行时多态:通过动态联编,也叫晚期绑定,在运行时确定。

现象:switch if等,在c++类对象中动态联编必须通过继承,虚函数,和指针(引用)来完成。

一个例子:

#include<iostream>using namespace std;class baseclass{    public:    baseclass(){        cout<<"base constructor"<<endl;    }    public :    ~baseclass(){        cout<<"base destructor"<<endl;    }};class childclass:public baseclass{    public:    childclass(){        cout<<"childcalss constructor"<<endl;    }    pubic :    ~childclass(){        cout<<"childless destructor"<<endl;    }};int main(){    base class *p = new childclass;    delete p;    return 0;}运行结果:baseclass constructorchildclass constructorbaseclass destructor//运行结束,但是没有调用子类的析构函数,导致内存泄漏。这是因为,程序中虽然有存在的指针和继承的关系,但是缺少了虚函数,所以这不是一个真正意义上的运行时多态,编译器根据指针类型(baseclass类)来调用析构函数。//当添加virtual的时候,baseclass的析构函数被重写,从而可以正常的析构。#include<iostream>using namespace std;class baseclass{    public:    baseclass(){        cout<<"base constructor"<<endl;    }    public :    virtual~baseclass(){        cout<<"base destructor"<<endl;    }};class childclass:public baseclass{    public:    childclass(){        cout<<"childcalss constructor"<<endl;    }    pubic :    ~childclass(){        cout<<"childless destructor"<<endl;    }};int main(){    base class *p = new childclass;    delete p;    return 0;}运行结果:baseclass constructorchildclass constructorchildclass destructorbaseclass destructor//实际上作为基类的析构函数一般都被写成虚析构函数


all

0 0