您的位置:首页 > 其它

静态编联与动态编联总结

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

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

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

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

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

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: