c 中基類與派生類中隱含的this指標的分析

2021-09-20 13:53:19 字數 1572 閱讀 7029

先不要看結果,看一下你是否真正了解了this指標?

1 #include2

using

namespace

std;34

class

parent

10 parent(int

x)14

virtual

void

f()17

void

g()20

21void

h()28

29private:30

void

y()33

};34

35class child : public

parent

41 child(int x) : parent(x+5)

47void

f()50

void

g()53

};54

55int

main()

/*

parent::h()

child f()

parent::g()

parent::y()

look here: 9306304

parent::h()

child f()

parent::g()

parent::y()

look here: 10

parent::h()

child f()

parent::g()

parent::y()

look here: 10

*/

首先child繼承了parent中的 h()方法!

我們new 了乙個child類的物件***, 用ch指向了它!

當ch去呼叫h()方法的時候,好了關鍵的問題來了,那就是此時的this指標到底是指向誰的....

要知道,this指標是和物件相關的,所以無論怎樣,那麼呼叫h()方法的是***這個物件,

那麼this就是指向***這個物件***!在入棧的時候,this也一同被壓入!既然this是指向***

的,為什麼會呼叫基類的g()方法呢?然後又呼叫的是派生類中的f()方法呢?(注意:g()方法

和f()方法在基類和派生類中都有).....

仔細看一下,是不是感覺和派生類向上轉型為基類的多型差不多啊。子類在呼叫h()方法時,其實

預設將this的型別進行了向上提公升,也就是由child* this -> parent* this;想一想這是必須的,

why?因為h()只是派生類繼承基類的,並沒有進行重寫!如果沒有進行this的型別提公升,那麼

如果h()方法中存在對基類私有成員的訪問,比如這個子類中的y()方法是私有的!h()中呼叫了

y(); 也就是this->y();是不是矛盾了?派生類中怎麼可以訪問基類中的私有成員呢???

所以this的型別一定向上提公升了!

如果還是不信,那你看一下 樣例2 中的x值是不是輸出的是基類中的 x 的值!

再看一看 樣例3中的輸出是不是和樣例2的輸出時一樣的!從f()的呼叫和g()呼叫

可以看出是多型的結果...

C 中的基類與派生類

繼承方式 說明 public 基類的public和protected的成員被派生類繼承後,保持原來的狀態 private 基類的public和protected的成員被派生類繼承後,變成派生類的private成員 protected 基類的public和protected的成員被派生類繼承後,變成派...

基類與派生類

初學c 的時候,很多人都很頭疼各種訪問標號下基類與派生類的關係,其實,死記硬背肯定不是乙個好的辦法,要知道它們之間的關係,先要分析一下訪問標號是如何產生的 在沒有繼承之前,類的只有兩類使用者 類本身和類的使用者。把類成員通過public和private劃分恰好體現了這一分割 類的使用者只能訪問類的p...

理解C 基類與派生類

通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。在c 語言中,乙個派生類可以從乙個基類派生,也可以從多個基類派生。從乙個基類派生...