天天看点

虚析构函数多态:联编:多态的分类:

多态:

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

联编:

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

多态的分类:

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

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

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

现象: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 ;
}

运行结果:
baseclass constructor
childclass constructor
baseclass 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 ;
}

运行结果:
baseclass constructor
childclass constructor
childclass destructor
baseclass destructor

//实际上作为基类的析构函数一般都被写成虚析构函数
           

all

继续阅读