基類指標和派生類指標的問題

2021-08-22 00:13:11 字數 1360 閱讀 3666

基類指標和引用可以指向派生類物件,但是卻只能呼叫基類方法而不允許呼叫派生類方法。其實這並不是問題,因為基類引用的意思是指向基類的引用,也就是說基類引用本質上是乙個基類物件,只不過將乙個派生類物件賦給它,它本質上還是乙個基類物件,只能呼叫基類的方法,而派生類並不排斥呼叫基類方法因為派生類本身就繼承了基類方法,這是很自然的。反過來就不能成立了,也就是說我們不要試圖將乙個派生類的引用(或指標)指向乙個基類物件,因為這個派生類的引用實質上就是乙個派生類物件,它會試圖去呼叫派生類中定義的方法,而有可能派生類呼叫的方法是乙個新定義在派生類中的方法並不包含在基類中,可能會涉及到派生類相對於基類來說的新成員,這對於基類來說是不可接受的。所以,試圖將乙個派生類的引用(或指標)指向乙個基類物件是錯誤的。

通常情況下,引用(或指標)有乙個規則就是引用(或指標)的型別與賦給的型別匹配。簡單的說,int &型的引用只能接受int型的值而不能接受和int不相容的值,但是繼承並不適用這一規則。也就是說類a的引用可以接受類b物件,前提是b是a的乙個派生類,a是b的基類

基類引用和指標可以指向派生類物件,使得基類引用定義的函式或指標引數可以用於基類物件或派生類物件,因為基類引用或指標定義的函式或指標形參可以接受派生類作為其實參。

也就是說如果classb類是classa的派生類,show()函式原型是void show(const classa &rt),那麼我們在呼叫show()函式時,既可以將classa類物件作為實參,也可以將其派生類classb類物件作為實參,這是被接受的。

既然這種函式呼叫被接受,很自然我們也可以接受另一種處理。就是將基類物件初始化為派生類物件。比如我初始化了派生類物件

classb classb_object(1840,"adam","lily","cat"),

然後我用classb類的物件classb_object初始化乙個classa的物件,如下:

classa classa_object(classb_object);

這看起來很奇怪,但是這是允許的。在初始化classa的物件 classa_object時,我們呼叫了乙個建構函式

classa(const classb &);

這個建構函式想接受乙個classb類的引用,但是這個建構函式並不存在,但是存在隱式的複製建構函式(這在前面的知識反覆提及)

classa(const classa &);

這個複製建構函式的形參是乙個指向classa類的引用。前面已經反覆說明,指向classa類的引用作為形參的函式,是可以接受乙個指向其派生類的引用作為實參的。因此,這個複製建構函式可以接受classb類的物件作為實參。

同樣的道理,也可以將派生類物件賦值給基類物件,將呼叫隱式過載賦值運算子。

classa &operator=(const classa &)const;

關於基類指標 派生類指標 基類物件派 生類物件問題

1 基類指向派生類的指標 2 派生類指向基類的指標 3 以及將派生類指標強制轉換為基類指標 4 將基類指標強制轉換為派生類指標 無論是基類指向派生類還是派生類指向基類,重點就是哪個類的指標就呼叫哪個類的方法,而輸出的是指標指向的物件。基類指向派生類的指標即將派生類物件賦給基類指標,如果輸出的話,呼叫...

繼承 基類和派生類指標

1,直接用基類指標引用基類物件 2,直接用派生類指標引用派生類物件 3,用基類指標引用乙個派生類物件,由於派生類物件也是基類的物件,所以這種引用是安全的,但是只能引用基類成員。若試圖通過基類指標引用那些只在派生類中才有的成員,編譯器會報告語法錯誤。解決該問題的答案是虛函式和多型性 4,用派生類指標引...

基類指標指向派生類

include class a virtual void vt private void a2 protected void a3 class b public a virtual void vt private void b2 protected void b3 int main 結論 1 對於派...