中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談c++靜態綁定、動態綁定

發布時間:2020-07-22 23:51:15 來源:網絡 閱讀:525 作者:小鎮青苔 欄目:編程語言


多態:指同一個實體同時具有多種形式,即一個名字可以具有多種語義。函數重載、類模板、函數模板等都屬于多態性。通俗來說就是接口的多種不同實現方式。

函數綁定:就是函數的入口地址同函數調用相聯系的過程。

分為靜態綁定和動態綁定。

兩者的區別:靜態綁定在程序執行前完成,由編譯系統或操作系統裝入程序計算函數的入口地址;而動態綁定則在執行過程中完成,由程序自身計算函數的入口地址。

靜態綁定:在編譯階段決定執行哪個同名的被調用函數。

//靜態綁定
#include<iostream>
#include<stdlib.h>
using namespace std;
class student 
{
public:
	void calfee()
	{
		_fee1 = 1000;
	}
	void print()
	{
		cout<<_fee1<<endl;	
	}
protected:
	int _fee1;
};
class Graduate:public student
{
public:
	void calfee()
	{
		_fee1 = 2000;
	}
	void print()
	{
		cout<<_fee1<<endl;	
	}
	

};
void fn(student &x)
{
	x.calfee();
	x.print();
}

int main()
{
	student s1;
	Graduate g1;
	fn(s1);
	fn(g1);
	system("pause");
	return 0;
}

結果:
1000
1000

動態綁定:是由編譯系統自動生成的、靜態或動態連接的、程序自身激活并執行的過程。在編譯階段不能決定執行哪個同名被調用函數,只在執行階段才能依據要處理的對象類型來決定執行哪個類的成員函數。

所以要實現動態綁定需要用到虛函數,虛函數是動態綁定的基礎。 


//動態綁定
#include<iostream>
#include<stdlib.h>
using namespace std;
class student 
{
public:
	virtual void calfee()
	{
		_fee1 = 1000;
	}
	virtual void print()
	{
		cout<<_fee1<<endl;	
	}
protected:
	int _fee1;
};
class Graduate:public student
{
public:
	void calfee()
	{
		_fee1 = 2000;
	}
	void print()
	{
		cout<<_fee1<<endl;	
	}
	

};
void fn(student &x)
{
	x.calfee();
	x.print();
}

int main()
{
	student s1;
	Graduate g1;
	fn(s1);
	fn(g1);
	system("pause");
	return 0;
}
結果:
1000
2000

下面分析一下虛函數

虛函數:也是類的一種成員函數,并且不能是靜態成員函數。

虛函數的作用是實現動態綁定,也就是在程序的運行階段動態的選擇合適的成員函數。從而實現多態性

設置虛函數的一寫注意事項

1、只有類的成員函數才能聲明為虛函數。因為虛函數只適用于有繼承關系的類對象,所以普通函數不能聲明為虛函數。

2、靜態成員不能是虛函數,因為靜態成員不受限于某個對象。

3、內聯函數不能是虛函數,因為內聯函數不能在運行中歐諾個動態的確定其位置。即使虛函數在類的內部定義,編譯時仍將其看做是非內聯的。

4、構造函數不能是虛函數,因為構造時對象還是一片未定型的空間。只有在構造完成后,對象才能成為一個類的名副其實的實例。

5、析構函數可以是虛函數,而且通常聲明為虛函數。目的在于:使用delete刪除一個對象時,確保析構函數能夠被正確運行。因為設置虛析構函數后,可以利用動態綁定方式選擇析構函數。


下面程序演示了析構函數在有些情況下必須設置為虛函數

class A
{
public:
	A()
	{
		cout<<"A()"<<endl;
	}
	virtual ~A()
	{
		cout<<"~A()"<<endl;
	}
};
class B:public A
{
private :
	char *_buf;
public:
	B(int i)
	{
		_buf = new char[i];
		cout<<"B()"<<endl;
	}
	virtual ~B()
	{
		delete[] _buf;
		cout<<"~B()"<<endl;
	}
};
void fun(A* pa)
{
	delete pa;
}
int main()
{
	A *pa = new B(10);
	fun(pa);
	system("pause");
	return 0;
}
結果:
A()
B()
~B()
~A()
如果將~A()不定義為虛函數,則結果為:~A()


純虛函數:無函數體的一種特殊的虛函數。

其聲明的格式為:virtual 類型 函數名(參數表)= 0;

抽象類:至少有一個純虛函數的類。

作用:將有關類組織在一個繼承層次結構中,由它提供一個公共的根,相關的子類都是從這個根派生出來的。

抽象類的使用規定:

1、抽象類只能用作其他類的基類,不能建立抽象類對象。

2、抽象類不能用作參數類型、函數返回類型或顯示轉換類型

3、可以定義抽象類的指針和引用,此指針可以指向它的派生類,從而實現多態。

class A //抽象類
{
public:
	A()
	{
		cout<<"A()"<<endl;
	}
	virtual ~A()
	{
		cout<<"~A()"<<endl;
	}
	virtual void fun()=0;
};
class B: public A 
{
	public:
	B()
	{
		cout<<"B()"<<endl;
	}
	virtual ~B()
	{
		cout<<"~B()"<<endl;
	}
	void fun()
	{
		cout<<"B::fun()"<<endl;
	}
};
class C: public A 
{
	public:
	C()
	{
		cout<<"C()"<<endl;
	}
	virtual ~C()
	{
		cout<<"~C()"<<endl;
	}
	void fun()
	{
		cout<<"C::fun()"<<endl;
	}
};
int main()
{
	A *arr[2];
	B b;
	C c;
	arr[0] = &b;
	arr[0]->fun();
	arr[1] = &c;
	arr[1]->fun();
	system("pause");
	return 0;
}






向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

横峰县| 旌德县| 晋州市| 麦盖提县| 阿克苏市| 呼伦贝尔市| 昭通市| 含山县| 土默特左旗| 株洲市| 博爱县| 肃宁县| 化德县| 永昌县| 岫岩| 元阳县| 光山县| 高邮市| 右玉县| 宣威市| 河北区| 雷州市| 太湖县| 沾益县| 威宁| 灯塔市| 竹山县| 宾阳县| 宁明县| 涞水县| 保亭| 长海县| 固镇县| 溧阳市| 淮安市| 海盐县| 普陀区| 广平县| 都江堰市| 温州市| 平武县|