静态编联与动态编联总结

编联就是将一个函数(或模块)程序内嵌到调用该函数(或模块)的程序中,然后生成可执行代码的过程。在这个过程中,对所调用的函数(或模块)分配内存地址空间,同时对外部访问也分配内存空间。

根据编联所处的阶段进行分类可以分成两类:静态编联和动态编联。

静态编联:静态编联又称为“早绑定”,是在编译期将函数调用和函数定义关联起来的,也就是说该函数是在编译期就已经将内存进行分配。如重载就是一种典型的静态编联,大部分函数基本都是静态编联。

动态编联:动态编联又称为“晚绑定”,是在运行期将函数调用和函数定义关联起来的,也就是说将程序的编联推迟到运行时进行。在多态中是使用动态编联最多的情况,如果基类涉及到虚函数时,当子类函数重写该成员函数后,那么当声明一个基类指针指向子类对象地址的行为就是使用动态编联的一个很好的应用。

下面我们将静态编联和动态编联以重载和覆盖两种模式实现出来(重载属于静态变量、覆盖属于动态编联):

#include "stdafx.h"
#include<iostream>
using namespace std;
class Base
{
public:
//Base()和Base(int a,float b);就是一对重载函数,重载的实现是在编译期完成的,编译之后就会生成两个修饰函数fun和int_float_fun。
Base();
Base(int a,float b);
virtual void print();
virtual ~Base();
private:
int m_a;
float m_b;
};


class SubClass :public Base
{
public:
SubClass();
SubClass(int a,float b,double c);
virtual void print();
virtual ~SubClass();
private:
double m_c;
};


Base::Base():m_a(1),m_b(1.0){}
Base::Base(int a,float b):m_a(a),m_b(b){}
void Base::print()
{
cout<<"Base print  "<<m_a<<" "<<m_b<<endl;
}
Base::~Base()
{

}


SubClass::SubClass():Base(),m_c(1.0){}
SubClass::SubClass(int a,float b,double c):Base(a,b),m_c(c){}
void SubClass::print()
{


cout<<"SubClass print  "<<m_c<<endl;
}
SubClass::~SubClass(){}
int main(int argc, char* argv[])
{
Base b;
b.print();
Base* b1=new SubClass;//动态编联是通过虚函数来实现的。函数在编译期是无法确定b1所调用的函数,必须通过运行期进行确定。
b1->print();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值