1樓:網友
先給個小例子。
#include
using namespace std;
class base
public:
virtual void dowork()
cout public:
virtual void dowork()
cout public:
virtual void dowork()
cout 這裡的pbase表現出了多型,對於pbase的不同敬侍啟實際型別,這裡會做不同的事。
pbase->dowork();
int main()
base* pfirst = new derivefirst();
work(pfirst);
base* psecond = new derivesecond();
work(psecond);
return 0;
多型:在work函式中的「pbase->dowork();這一行**就表現出了pbase的多型性,當pbase的實際型別是derivesecond時,它呼叫亮如的是derivesecond版本的dowork,當它是derivefirst時,它呼叫的是derivefirst版本的dowork。
同化效應:老實說之前沒見過這個名字。猜測它所指的應該是在work中,不需要關心pbase的具體型別,對於合法的以base為基類的任何類的物件,在這裡都能一致的處理它,只需要呼叫dowork就能在執行時達到我們想要的效果。
這裡簡單說一下,一般編譯器都是通過虛擬函式表的方式來實現虛擬函式,即對於擁有虛擬函式的類,它內部會儲存一張函式對映表,當你呼叫某乙個函式時,它會根據這個函式對應的索引找到正確的函式版本。
2樓:費涵寒
⊙o⊙)…怎麼理解那個中的同化呢?
你所說的同化就是派生類的物件隱式的轉化為它的基類物件(應為它是它的派生,可以型別相容),就像在基本資料型別中把乙個float的變數賦給乙個int變數一樣的道理。
還有就是這個多型,什麼是多型啊,說白點就是乙個類中有虛擬函式,那麼這個類就是多型類。你說和 多型有什麼聯絡?這個可是有本質的區別啊歷老?
他們各有各的實現機制,有本質區別。這裡給你簡單說說,說多了歲蘆說不完!那個隱式轉化時應該是很普通很常見的機制,而這個多型比較複雜,他牽扯乙個虛擬函式表(這裡只給你提提,最好你下去查查資料,看看書),在乙個函肢雀公升數中無虛擬函式的派生類作為基類的引用式形參時被同化,沒有表現多型性。
也就是說,派生類不能表現出自己的特性,而是表現出了基類的特性,若有虛擬函式的話,就能表現出派生類的特性了!
在c++中虛擬函式和多型性是什麼意思
3樓:胥菱廉依白
虛擬函式是在基類中定義的,目的是不確定它的派生類的具體行為。例:
定義乙個基類:class
animal//動物。它的函式為breathe()//呼吸。
再定義乙個類class
fish//魚。
它的函式也為breathe()
再定義乙個類class
sheep/羊。它的函式也為breathe()為了簡化**,將fish,sheep定義成基類animal的派生類。
然而fish與sheep的breathe不一樣,乙個是在水中通過水來呼吸,乙個是直接呼吸空氣。所以基類不能確定該如何定義breathe,所以在基類中只定義了乙個virtual
breathe,它是乙個空的虛擬函式。具本的函式在子類中分別定義。程式一般執行時,找到類,如果它有基類,再找它的基類,最後執行的是基類中的函式,這時,它在基類中找到的是virtual標識的函式,它就會再回到子類中找同名函式。
派生類也叫子類。基類也叫父類。這就是虛擬函式的產生,和類的多型性(breathe)的體現。
這裡的多型性是指類的多型性。
函式的多型性是指乙個函式被定義成多個不同引數的函式,它們一般被存在標頭檔案中,當你呼叫這個函式,針對不同的引數,就會呼叫不同的同名函式。例:rect()//矩形。
它的引數可以是兩個座標點(point,point)也可能是四個座標(x1,y1,x2,y2)這叫函式的多型性與函式的過載。
c中解構函式中可以呼叫虛擬函式麼
c 中 析構 函式中不可以呼叫虛擬函式。effective c 中有這樣的描述 同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c 就將它們視為不再存在。c 中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類...
C中父類的虛擬函式必須要實現嗎
虛擬函式是自帶實現的,因此派生類中可以選擇實現自己的,也可以直接使用基版類的。但是純虛擬函式一般權未提供實現,所以派生類基本需要提供實現,但是即使基類提供了預設實現,如果派生類需要進行例項化,那麼派生類還是需要提供實現的。你可以定義純虛擬函式,這部需要實現 c 中虛擬函式必須有定義嗎?需要例項化類的...
C 中在基類裡宣告為const的純虛擬函式在派生類裡的同名函
必須,函式是否為const也是過載條件之一比如在一個類裡,存在重名函式 void print void print const 那麼是合法的過載 但是如果是 int print const int print 則不是合法過載 因此想要實體化circle類,必須實現一個形如double print c...