动、静态联编
简单的说,静态联编就是在程序编译时就完成的过程,而动态联编是在程序运行中完成的过程
class CA
{
public:
void CAFun()
{
cout<<"CA----Fun"<<endl;
}
}
CA A;
A.CAFun();
//这里就是一个静态联编
静态联编平时使用较多,在C++实现多态时多用动态联编
class CA
{
public:
virtual void Fun()
{
cout<<"CA----Fun"<<endl;
}
}
class CB : public CA
{
public:
void Fun()
{
cout<<"CB----Fun"<<endl;
}
}
class CD :public CA,public CB
{
public:
void Fun()
{
cout<<"CA----Fun"<<endl;
}
}
//这就是一个动态联编
void objFun(CA * src[],int len)
{
for(int i=0;i<len;++i)
{
src[i]->Fun();
}
}
CB B;
CD D;
CA *A[2]={&B,&D};
objFun(A,2);//调用函数
//这里输出
//CB----Fun
//CD----Fun
纯虚函数
class CA
{
public:
virtual void Fun()=NULL;//纯虚函数
}
上面就是纯虚函数的书写方式,那么它有什么作用呢
纯虚函数的作用是为派生类提供一个统一的接口,当一个基类对虚函数没有一个有意义的实现的时候,可以声明纯虚函数
有纯虚函数存在的类,叫做抽象类,因为它存在纯虚函数,所以必定是作为一个基类,所以也叫做抽象基类,它的纯虚函数的实现在派生类中实现,如果派生类没有给出一个实现,那么这个派生类继续作为一个抽象基类存在
抽象基类的特点
抽象基类不能实例化对象,不过可以通过声明指针和引用来指向派生类对象
习惯上,将抽象基类的构造析构属性改为保护
class CA
{
public:
virtual void Fun()=NULL;
virtual void Fun(int n)=NULL;
}
class CB :public CA
{
public:
void Fun()
{
cout<<"CBFun"<<endl;
}
}
class CD :public CB
{
public:
void Fun(int n)//CB中没有对CA中重载的纯虚函数进行实现,在这里实现
{
cout<<"CDFun"<<endl;
}
}
抽象基类不能实例化对象,不过可以通过声明指针和引用来指向派生类对象
CA *pA;
CB B;
pA=&B;
pA->Fun();
//这里输出CB的Fun函数