先看一下下面的例子:
// file1:cbase.h
#include
using namespace std;
class cbase
;virtual ~cbase(void){};//如果乙個類被用來作為基類的時候,最好把析構函式寫成虛函式。這樣做是為了當用 乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。
// pure inherit
virtual void fun1(int)
// override
virtual void fun2(int)
// hide
virtual void fun3(int)
};//file2:cderived.h
#include "base.h"
class cderived : public cbase
;~cderived(void){};// 注意同基類的比較
說明: 1. 如果派生類只是使用基類的某個方法,那只要繼承目標基類,派生類中也不需要再次宣告目標方法,這就是繼承(inherit);
2. 如果基類和派生類中有兩個名字一樣的函式:
滿足下面的兩個條件
(a) 在基類中函式宣告的時候有virtual關鍵字;
(b) 基類中的函式和派生類中的函式「一模一樣」,函式名,引數,返回型別都一樣;
那麼這就是叫做覆蓋(override),這也就是虛函式多型的性質。不滿足上面覆蓋的條件,就是隱藏(hide)了。
3. 好多人認為,基類cbase中的fun3(int)會繼承下來和cderived中的fun3(int,int)在派生類cd中構成過載,就像例項中想像的那樣。對嗎?我們先看過載的定義:
必須在乙個域中,函式名稱相同但是函式引數不同。過載的作用就是同乙個函式有不同的行為,因此不是在乙個域中的函式是無法構成過載的,這個是過載的重要特徵。
必須在乙個域中,而繼承明顯是在兩個類中了哦,所以上面的想法是不成立的,我們測試的結果也是這樣,派生類中的fun3(int,int)把基類中的fun3(int)隱藏了,所以,相同的函式名的函式,在基類和派生類中的關係只能是覆蓋或者隱藏。
4. 隱藏的定義(這段話是網上google來的):
隱藏(hide):指的是派生類的成員函式隱藏了基類函式的成員函式。
可以這麼理解:在呼叫乙個類的成員函式的時候,編譯器會沿著類的繼承鏈逐級的向上查詢函式的定義,如果找到了那麼就停止查詢了,所以如果乙個派生類和乙個基類都有同乙個同名(暫且不論引數是否相同)的函式,而編譯器最終選擇了在派生類中的函式,那麼我們就說這個派生類的成員函式「隱藏」了基類的成員函式,也就是說它阻止了編譯器繼續向上查詢函式的定義。
C 中的繼承
一 繼承 什麼是繼承 繼承是允許重用現有類去建立新類的過程。分類的原則是乙個類派生出來的子類具有這個類的所有非私有的屬性。1 繼承c 中的類 c 不支援多重繼承,c 類始終繼承自乙個基類 如果未在宣告中指定乙個基類,則繼承自 system.object 派生類繼承基類的語法如下 using syst...
C 中的繼承
繼承,資料抽象和動態繫結是物件導向程式設計的核心思想。使用繼承,可以定義相似的型別並對其相似關係進行建模。通過繼承聯絡在一起的類構成一種層次關係,通常在層次關係的根部有乙個基類,其他類則直接或間接地從基類繼承而來,這些繼承得到的類稱為派生類。下面就讓我們一起來 繼承中的一些常見問題。1.繼承方式cl...
C 中的繼承
繼承是c 中的三大特性之一。繼承機制是物件導向程式設計使 可以復用的最重要的手段,它允許程式設計師在保持原有類特性的基礎上進行擴充套件,增加功能。這樣產生新的類,叫做派生類。繼承定義的格式 class deriveclassname 派生類名 asecc label 繼承型別 baseclassna...