C++ Primer Plus學習筆記之虛函數
C++語言的多态性有兩種類型:靜态多态性和動态多态性。函數重載和運算符重載就是靜态多态性的具體表現,而動态多态性是指程式運作過程中才動态的确定操作所針對的對象,它是通過虛函數實作的;
1,虛函數的概念:
一個指向基類的指針可用來指向從基類派生的任何對象,這樣就可以達到一個接口多個實作的通路了;虛函數是在基類中被冠以virtual的成員函數,它提供了一種接口界面。虛函數可以在一個或者多個派生類中被重新定義,但要求在派生類中從新定義時,虛函數的函數原型,包括傳回值,函數名,參數名,參數個數,參數類型的順序必須完全相同;
2,晚期比對是怎麼發生的???
所有的工作由編譯器在幕後完成。為了完成這件事,編譯器對每個包含虛函數的類建立一個表成為VTABLE。在VTABLE中,編譯器放置特定類的虛函數位址。在每個帶有虛函數的類中,編譯器秘密的置一指針,成為VPTR指向這個對象的VTABLE。通過基類指針做虛函數調用時,編譯器靜态的插入取得這個VPTR,并在VTABLE表中查找函數位址的代碼。
3,虛特性:
用虛函數實作運作時多态性德關鍵之處是:必須使用指向基類的指針或引用通路虛函數。
注意:
在派生類中重新定義基類的虛函數是函數重載的另一種特殊形式,它不屬于一般的函數重載。當重載一般函數時,僅要求函數名相同,但重載一個虛函數時,要求函數名,傳回類型,參數個數,參數類型,參數順序完全相同,否則會導緻虛特性丢失;
#include<iostream>
using namespace std;
class figure
{
public:
void set(double i=0,double j=0)
{
x=i;
y=j;
}
virtual void show_area()
{
cout<<"No area computation defined for this class"<<endl;
}
protected:
double x;
double y;
};
class triangle:public figure
{
public:
void show_area()
{
cout<<"Triangle with high "<<x<<" and base "<<y;
cout<<" has an area of "<<0.5*x*y<<endl;
}
};
class square:public figure
{
public:
void show_area()
{
cout<<"Square with dimension "<<x<<"*"<<y;
cout<<" has an area of "<<x*y<<endl;
}
};
class circle:public figure
{
public:
void show_area()
{
cout<<"Circle with radius "<<x;
cout<<" has an area of "<<3.14*x*x<<endl;
}
};
int main(int argc,char *argv[])
{
figure *f;
triangle t;
square s;
circle c;
f=&t;
f->set(10,5);
f->show_area();
f=&s;
f->set(10,5);
f->show_area();
f=&c;
f->set(10);
f->show_area();
return 0;
}
運作結果:
Triangle with high 10 and base 5 has an area of 25
Square with dimension 10*5 has an area of 50
Circle with radius 10 has an area of 314