PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   想問C++的問題... (https://www.pcdvd.com.tw/showthread.php?t=340949)

魔師傲神州 2004-05-31 10:46 PM

想問C++的問題...
 
禮拜三要考機測了...

可是一直搞不懂關鍵字virtual是做啥用的:cry:

尤其是虛擬函數...根本不了解課本在講啥

今天上課想問老師結果...

他說他要去警局做筆錄提早下課~~~:jolin:

harrisonlin 2004-05-31 11:34 PM

Virtual function, 虛擬函數(一談到虛擬,是不是就讓人覺得莫測高深?),指的是"不經由父類別實作",而交由衍生的類別實作的成員函式。

舉個例子來說,假設我寫了一個"樂器"的類別;由於所有的樂器,像是大鼓,提琴,喇叭等,都各自有其演奏的方式,雖然行為名稱(函式名稱)相同,但真正的行為(成員函式的實作)可能大異其趣(假設我們可以用程式表示出它們的"演奏方式")。所以當大鼓,提琴,喇叭等繼承樂器這個類別之後,必須各自去實作"演奏"這個行為。如果這個行為由"樂器"這個父類別實作,一來不合實際(每個衍生自它的子類別的"演奏方式"都不同"),二來子類別還要再覆寫這個父類別的成員函式,容易造成邏輯上的混淆,所以才將父類別的成員函式定義為"virtual",指明交由衍生類別去實作(而且不實作不行...除非子類別又將這個成員函式定為"virtual",指明由子類別的子類別去實作)。也許你也可以將一個帶有"virtual function" 的類別想像成它的眾多衍生類別的"規格書" - 保證衍生類別一定有著某種"介面(也就是實作那些 virtual function)",雖然各自實作的方式不盡相同。在 Java 中,這種概念被提昇為 "Interface", 也就是"介面",更為直觀,處理的方式也更為清楚。

不知這樣解釋清楚嗎? :)

魔師傲神州 2004-06-01 11:43 AM

能否給一段簡單的程式碼
看實際的程式碼比較容易懂它的作用在哪裡
剛剛在系機房試了很久還是摸不著頭緒:cry:

ABSOLUT 2004-06-01 12:12 PM

引用:
Originally posted by harrisonlin
Virtual function, 虛擬函數(一談到虛擬,是不是就讓人覺得莫測高深?),指的是"不經由父類別實作",而交由衍生的類別實作的成員函式。

舉個例子來說,假設我寫了一個"樂器"的類別;由於所有的樂器,像是大鼓,提琴,喇叭等,都各自有其演奏的方式,雖然行為名稱(函式名稱)相同,但真正的行為(成員函式的實作)可能大異其趣(假設我們可以用程式表示出它們的"演奏方式")。所以當大鼓,提琴,喇叭等繼承樂器這個類別之後,必須各自去實作"演奏"這個行為。如果這個行為由"樂器"這個父類別實作,一來不合實際(每個衍生自它的子類別的"演奏方式"都不同"),二來子類別還要再覆寫這個父類別的成員函式,容易造成邏輯上的混淆,所以才將父類別的成員函式定義為"virtual",指明交由衍生類別去實作(而且不實作不行...除非子類別又將這個成員函式定為"virtual",指明由子類別的子類別去實作)。也許你也可以將一個帶有"virtual function" 的類別想像成它的眾多衍生類別的"規格書" - 保證衍生類別一定有著某種"介面(也就是實作那些 virtual function)",雖然各自實作的方式不盡相同。在 Java 中,這種概念被提昇為 "Interface", 也就是"介面",更為直觀,處理的方式也更為清楚。

不知這樣解釋清楚嗎? :)


推~

很棒的解釋!~ 受教了!

harrisonlin 2004-06-01 02:10 PM


代碼:
#include <iostream.h>

/*
 *	所有樂器的父類別.
 */
class Instrument {
public:
	/*
	 *	所有的樂器都有"play"的行為,所以不由父類別實作,
	 *  交由衍生類別實作之.
	 */
	virtual void play() = 0;
};


/*
 *	大鼓
 */
class Drum : Instrument {
public:
	void play() {
		cout << "This is Durm playing..." << endl;
	}
};

/*
 *	喇叭
 */
class Horn : Instrument {
public:
	void play() {
		cout << "This is Horn playing..." << endl;
	}
};

/*
 *	吉他
 */
class Guitar : Instrument {
public:
	void play() {
		cout << "This is Guitar playing..." << endl;
	}
};

void main() {
	/*
	 *	產生 3 種樂器.
	 */
	Guitar guitar;
	Drum drum;
	Horn horn;

	/*
	 *	幫我的樂團加入 3 種樂器 - 也就是將各樂器的"指標"記下,之後便透過
	 *  指標操作樂器.注意: myBand 是一個儲存 Instrument* 的指標陣列.
	 */
	Instrument* myBand[] = {(Instrument*)&guitar,
							(Instrument*)&drum,
							(Instrument*)&horn};

	/*
	 *	將 myBand 的樂器一一操作.在這裡我不需要知道是什麼樂器,只要呼叫它的 "play()"
	 *  就可以了!這就是"多型(Polymorphism)"的好處!!而"多型"在C++中就是透過 virtual function 來達成!
	 */
	for(int index = 0; index < 3; ++index) {
		myBand[index]->play();
	}
}

R-D 2004-06-01 02:24 PM

嗯..真佩服用中文來學程式..那些專有名詞用英文已經夠多要記得了(不過意思還滿相近), 用中文看起來,覺得難好多!!:(
每次我有不會的的程式東西,想說找找中文的解釋看看會不會讓我比較瞭解,每想到一看更頭大 :D
只能說,在台灣的程式設計師.. 不簡單!! 佩服佩服:like:


所有的時間均為GMT +8。 現在的時間是07:35 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。