![]() |
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)
|
|---|
想問C++的問題...
禮拜三要考機測了...
可是一直搞不懂關鍵字virtual是做啥用的:cry: 尤其是虛擬函數...根本不了解課本在講啥 今天上課想問老師結果... 他說他要去警局做筆錄提早下課~~~:jolin: |
Virtual function, 虛擬函數(一談到虛擬,是不是就讓人覺得莫測高深?),指的是"不經由父類別實作",而交由衍生的類別實作的成員函式。
舉個例子來說,假設我寫了一個"樂器"的類別;由於所有的樂器,像是大鼓,提琴,喇叭等,都各自有其演奏的方式,雖然行為名稱(函式名稱)相同,但真正的行為(成員函式的實作)可能大異其趣(假設我們可以用程式表示出它們的"演奏方式")。所以當大鼓,提琴,喇叭等繼承樂器這個類別之後,必須各自去實作"演奏"這個行為。如果這個行為由"樂器"這個父類別實作,一來不合實際(每個衍生自它的子類別的"演奏方式"都不同"),二來子類別還要再覆寫這個父類別的成員函式,容易造成邏輯上的混淆,所以才將父類別的成員函式定義為"virtual",指明交由衍生類別去實作(而且不實作不行...除非子類別又將這個成員函式定為"virtual",指明由子類別的子類別去實作)。也許你也可以將一個帶有"virtual function" 的類別想像成它的眾多衍生類別的"規格書" - 保證衍生類別一定有著某種"介面(也就是實作那些 virtual function)",雖然各自實作的方式不盡相同。在 Java 中,這種概念被提昇為 "Interface", 也就是"介面",更為直觀,處理的方式也更為清楚。 不知這樣解釋清楚嗎? :) |
能否給一段簡單的程式碼
看實際的程式碼比較容易懂它的作用在哪裡 剛剛在系機房試了很久還是摸不著頭緒:cry: |
引用:
推~ 很棒的解釋!~ 受教了! |
代碼:
#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();
}
}
|
嗯..真佩服用中文來學程式..那些專有名詞用英文已經夠多要記得了(不過意思還滿相近), 用中文看起來,覺得難好多!!:(
每次我有不會的的程式東西,想說找找中文的解釋看看會不會讓我比較瞭解,每想到一看更頭大 :D 只能說,在台灣的程式設計師.. 不簡單!! 佩服佩服:like: |
| 所有的時間均為GMT +8。 現在的時間是07:35 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2026。