多态:
字面意思:多种形态,在编程中指的是同样的消息(成员函数等)被不同的对象接受时导致的完全不相同的行为的一种现象。
联编:
确定程序中操作与执行该操作的代码段之间的映射关系。(简单来说就是你妈说你可以吃糖,联翩就是绑定你吃的是哪种糖,硬糖还是软糖)
多态的分类:
编译时多态:通过静态联编,也叫早期绑定,在编译阶段进行。
现象:函数重载和操作符重载,隐藏等。
运行时多态:通过动态联编,也叫晚期绑定,在运行时确定。
现象: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