c++的动静态连编
想必大家遇到c++面向对象中的动静态连编,都会发蒙。
但是,不要怕,看我给你讲解。
首先,要理解连编的意义
连编:将模块或函数合并生成可执行代码的处理过程,让程序知道你是要调用哪个函数(不要忘了函数重载)
然后,连编又按不同的进行阶段分为动态连编和静态连编
静态连编:编译阶段就将函数实现与函数调用关联起来;
动态连编:在程序执行阶段才将函数实现和调用关联;
注:应为C语言不支持函数重载所以都是静态连编
看到这里,你肯定想问。能不能举个栗子呢?
答:当然可以
静态连编:
#include<iostream>
using namespace std;
class base_c{
public:
base_c(){
cout<<"new a base_c"<<endl;
}
void function(){
cout<<"a function of base_c"<<endl;
}
~base_c(){
cout<<"base_c is died"<<endl;
}
};
int main(int argc,char* argv[]){
base_c baseC;
baseC.function();
return 0;
}
结果:
这个在编译期就指定了function()是访问base::function
动态连编:
#include<iostream>
using namespace std;
class base_c{
public:
base_c(){
cout<<"new a base_c"<<endl;
}
virtual void function(){
cout<<"a function of base_c"<<endl;
}
virtual ~base_c(){
cout<<"base_c is died"<<endl;
}
};
class sub_c:public base_c{
public:
sub_c():base_c(){
cout<<"new a sub_c"<<endl;
}
void function(){
cout<<"a function of sub_c"<<endl;
}
~sub_c(){
cout<<"sub_c is died"<<endl;
}
};
int main(int argc,char* argv[]){
base_c* p;
int index;
cin>>index;
switch(index){
case 1:
p = new base_c;
break;
case 2:
p = new sub_c;
break;
}
p->function();
delete p;
return 0;
}
运行结果:
所以,你学废了么?学废了的点个赞,没学废的扣眼珠子。