PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

回應
 
主題工具
魔師傲神州
Major Member
 

加入日期: Sep 2003
您的住址: 台北汐止
文章: 174
想問C++的問題...

禮拜三要考機測了...

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

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

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

他說他要去警局做筆錄提早下課~~~
     
      
舊 2004-05-31, 10:46 PM #1
回應時引用此文章
魔師傲神州離線中  
harrisonlin
Advance Member
 
harrisonlin的大頭照
 

加入日期: Jun 2003
您的住址: Taipei
文章: 442
Virtual function, 虛擬函數(一談到虛擬,是不是就讓人覺得莫測高深?),指的是"不經由父類別實作",而交由衍生的類別實作的成員函式。

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

不知這樣解釋清楚嗎?
 
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古...

此文章於 2004-05-31 11:54 PM 被 harrisonlin 編輯.
舊 2004-05-31, 11:34 PM #2
回應時引用此文章
harrisonlin離線中  
魔師傲神州
Major Member
 

加入日期: Sep 2003
您的住址: 台北汐止
文章: 174
能否給一段簡單的程式碼
看實際的程式碼比較容易懂它的作用在哪裡
剛剛在系機房試了很久還是摸不著頭緒
舊 2004-06-01, 11:43 AM #3
回應時引用此文章
魔師傲神州離線中  
ABSOLUT
*停權中*
 
ABSOLUT的大頭照
 

加入日期: Aug 2001
您的住址: TAIPEI
文章: 590
Thumbs up

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

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

不知這樣解釋清楚嗎?


推~

很棒的解釋!~ 受教了!
舊 2004-06-01, 12:12 PM #4
回應時引用此文章
ABSOLUT離線中  
harrisonlin
Advance Member
 
harrisonlin的大頭照
 

加入日期: Jun 2003
您的住址: Taipei
文章: 442

代碼:
#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();
	}
}
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古...
舊 2004-06-01, 02:10 PM #5
回應時引用此文章
harrisonlin離線中  
R-D
Major Member
 

加入日期: Jun 2001
您的住址: 澳洲雪梨
文章: 210
嗯..真佩服用中文來學程式..那些專有名詞用英文已經夠多要記得了(不過意思還滿相近), 用中文看起來,覺得難好多!!
每次我有不會的的程式東西,想說找找中文的解釋看看會不會讓我比較瞭解,每想到一看更頭大
只能說,在台灣的程式設計師.. 不簡單!! 佩服佩服
__________________
Open Souls movement
舊 2004-06-01, 02:24 PM #6
回應時引用此文章
R-D離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



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


vBulletin Version 3.0.1
powered_by_vbulletin 2026。