静态编联与动态编联总结
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;
}
根据编联所处的阶段进行分类可以分成两类:静态编联和动态编联。
静态编联:静态编联又称为“早绑定”,是在编译期将函数调用和函数定义关联起来的,也就是说该函数是在编译期就已经将内存进行分配。如重载就是一种典型的静态编联,大部分函数基本都是静态编联。
动态编联:动态编联又称为“晚绑定”,是在运行期将函数调用和函数定义关联起来的,也就是说将程序的编联推迟到运行时进行。在多态中是使用动态编联最多的情况,如果基类涉及到虚函数时,当子类函数重写该成员函数后,那么当声明一个基类指针指向子类对象地址的行为就是使用动态编联的一个很好的应用。
下面我们将静态编联和动态编联以重载和覆盖两种模式实现出来(重载属于静态变量、覆盖属于动态编联):
#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;
}
相关文章推荐
- SpringMVC 学习系列 (7) 之 格式化显示
- codeforces Searching for Graph
- 如何发表高水平论文 (转载)
- 快速排序的简单实现(Quick_Sort)
- Java Axis2 1.6.3+JDK1.7.0_13+Tomcat7.0.65+eclipse搭建web service
- SpringMVC 学习系列 (6) 之 数据验证
- 你必须知道的.NET之特性和属性
- KMP模板
- 关于手机屏幕信息的获取
- 13 Roman to Integer
- SpringMVC 学习系列 (5) 之 数据绑定 -2
- Kinect+Unity之手势识别初探
- C#实现插入排序算法(Insection Sort)
- RelativeLayout属性
- ul li span addClass removeClass
- swift 2.0 语法 函数
- swift 2.0 语法 字符串
- java的相关特性理解
- /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc
- SpringMVC 学习系列 (4) 之 数据绑定 -1