c++的動態綁定和靜態綁定
阿新 • • 發佈:2018-08-09
關於 code 多態 自己的 特性 缺省參數 something ++ 16px
為了支持c++的多態性,才用了動態綁定和靜態綁定。
1、對象的靜態類型:對象在聲明時采用的類型。是在編譯期確定的。
2、對象的動態類型:目前所指對象的聲明。在運行期決定。對象的動態類型可以更改,但是靜態類型無法更改。
關於對象的靜態類型和動態類型,看一個示例:
class A{};
class B: public A{};
class C: public A{};
int main()
{
C *pc=new C();//pc的靜態類型是它聲明的類型C*,動態類型也是C*
A *pa=pc;//pa的靜態類型是它聲明的類型A*,pa的動態類型所指向的對象pc的類型A*
B *pb=new B();
pa=pb;//pa的動態類型是可以更改的,現在它的動態類型是B*
return 0;
}
3、靜態綁定:綁定的是對象的靜態類型,某特性(比如函數)依賴於對象的靜態類型,發生在編譯期。
4、動態綁定:綁定的是對象的動態類型,某特性(比如函數)依賴於對象的動態類型,發生在運行期。
class A
{
public:
void dosomething()
{
cout<<"A"<<endl;
}
virtual void fun()
{
cout<<"virtual A "<<endl;
}
};
class B: public A
{
public:
void dosomething()
{
cout<<"B"<<endl;
}
virtual void fun()
{
cout<<"virtual B"<<endl;
}
};
class C: public A
{
public:
void dosomething()
{
cout<<"C"<<endl;
}
virtual void fun()
{
cout<<"virtual C"<<endl;
}
};
int main()
{
C *pc=new C();//pc的靜態類型是它聲明的類型C*,動態類型也是C*
pc->dosomething(); // C
pc->fun(); // virtual C
A *pa=pc;//pa的靜態類型是它聲明的類型A*,pa的動態類型所指向的對象pc的類型A*
pa->dosomething(); // A ①
pa->fun(); // virtual C
B *pb=new B();
pb->dosomething(); //B
pb->fun(); // virtual B
pa=pb;//pa的動態類型是可以更改的,現在它的動態類型是B*
pa->dosomething(); // A ②
pa->fun(); // virtual B
return 0;
}
dosomething()是一個非虛函數,它是靜態綁定的,也就是在編譯的時候根據對象的靜態類型來選擇函數,所以,pa、pb、pc調用的都是自己的的dosomething()函數,但對於①中的pa的fun()函數和②中的pa的fun()函數,因為fun()為虛函數,它們綁定的是動態對象,所以①的pa調用的是pc的fun()函數,②的pa調用的是pb的fun()函數。
需要註意的是:
當缺省參數和虛函數一起出現的時候情況就有點復雜,因為虛函數是動態綁定的,但是為了執行效率,缺省參數是靜態綁定的。
class A
{
public:
virtual void fun(int i=10)
{
cout<<"virtual A "<<i<<endl;
}
};
class B: public A
{
public:
virtual void fun(int i=20)
{
cout<<"virtual B "<<i<<endl;
}
};
int main()
{
B *b=new B();
A *a=b;
b->fun();//virtual B 20
a->fun();//virtual B 10
return 0;
}
b->fun()、a->fun()調用的都是b的fun()函數,但是缺省函數是靜態綁定的,所以a->fun()調用的是a的虛函數fun()裏面的缺省值10,b->fun()調用的是b的虛函數fun()裏面的缺省值20。
只有涉及虛函數的地方才存在動態綁定!!!!
參考博客:https://blog.csdn.net/chgaowei/article/details/6427731
c++的動態綁定和靜態綁定