天天看點

C++ Primer Plus學習筆記之虛函數C++ Primer Plus學習筆記之虛函數

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