静态类型和动态类型
静态类型和动态类型是针对于对象来说的:
- 对象的静态类型:就是它在程序中被声明时所采用的类型(或理解为类型指针或引用的字面类型),在编译期确定;
- 对象的动态类型:是指类型指针或引用的实际类型,在运行期确定;
静态绑定和动态绑定
- 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,比如:函数重载;
- 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态。
比如常见的,virtual函数是动态绑定,non-virtual函数是静态绑定,缺省参数值也是静态绑定。
#include<iostream>
using namespace std;
class Base
{
public:
virtual void Func1()
{
cout<<"Base::Func1()"<<endl;
}
}
class Derive:public Base
{
public:
virtual void Func1()
{
cout<<"Derived::Func1()"<<endl;
}
virtual void StaticFunc()
{
cout<<"Derived::StaticFunc()"<<endl;
}
void Test(Base& b)
{
b.Func1();
}
int main()
{
Base b;
Test(b);//动态绑定
Derive d;
Test(d);//动态绑定
d.StaticFunc();//静态绑定
return 0;
}