![]() |
||
|
Major Member
![]() 加入日期: Sep 2003 您的住址: 台北汐止
文章: 174
|
想問C++的問題...
禮拜三要考機測了...
可是一直搞不懂關鍵字virtual是做啥用的 尤其是虛擬函數...根本不了解課本在講啥 今天上課想問老師結果... 他說他要去警局做筆錄提早下課~~~ ![]() |
|||||||
|
|
|
Advance Member
![]() ![]() 加入日期: Jun 2003 您的住址: Taipei
文章: 442
|
Virtual function, 虛擬函數(一談到虛擬,是不是就讓人覺得莫測高深?),指的是"不經由父類別實作",而交由衍生的類別實作的成員函式。
舉個例子來說,假設我寫了一個"樂器"的類別;由於所有的樂器,像是大鼓,提琴,喇叭等,都各自有其演奏的方式,雖然行為名稱(函式名稱)相同,但真正的行為(成員函式的實作)可能大異其趣(假設我們可以用程式表示出它們的"演奏方式")。所以當大鼓,提琴,喇叭等繼承樂器這個類別之後,必須各自去實作"演奏"這個行為。如果這個行為由"樂器"這個父類別實作,一來不合實際(每個衍生自它的子類別的"演奏方式"都不同"),二來子類別還要再覆寫這個父類別的成員函式,容易造成邏輯上的混淆,所以才將父類別的成員函式定義為"virtual",指明交由衍生類別去實作(而且不實作不行...除非子類別又將這個成員函式定為"virtual",指明由子類別的子類別去實作)。也許你也可以將一個帶有"virtual function" 的類別想像成它的眾多衍生類別的"規格書" - 保證衍生類別一定有著某種"介面(也就是實作那些 virtual function)",雖然各自實作的方式不盡相同。在 Java 中,這種概念被提昇為 "Interface", 也就是"介面",更為直觀,處理的方式也更為清楚。 不知這樣解釋清楚嗎? ![]()
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古...
此文章於 2004-05-31 11:54 PM 被 harrisonlin 編輯. |
||
|
|
|
Major Member
![]() 加入日期: Sep 2003 您的住址: 台北汐止
文章: 174
|
能否給一段簡單的程式碼
看實際的程式碼比較容易懂它的作用在哪裡 剛剛在系機房試了很久還是摸不著頭緒 ![]() |
|
|
|
*停權中*
加入日期: Aug 2001 您的住址: TAIPEI
文章: 590
|
引用:
推~ 很棒的解釋!~ 受教了! |
|
|
|
|
Advance Member
![]() ![]() 加入日期: 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();
}
}
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古...
|
|
|
|
Major Member
![]() 加入日期: Jun 2001 您的住址: 澳洲雪梨
文章: 210
|
嗯..真佩服用中文來學程式..那些專有名詞用英文已經夠多要記得了(不過意思還滿相近), 用中文看起來,覺得難好多!!
每次我有不會的的程式東西,想說找找中文的解釋看看會不會讓我比較瞭解,每想到一看更頭大 只能說,在台灣的程式設計師.. 不簡單!! 佩服佩服 ![]()
__________________
Open Souls movement |
|
|