父類指標指向子類物件問題

2021-09-12 15:08:54 字數 1085 閱讀 7155

子類與父類指標呼叫相關注意事項

1,如果以乙個基礎類指標指向乙個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(靜態聯翩)

2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾。(一般不會這麼去定義)

3,如果基礎類和衍生類定義了相同名稱的成員函式,那麼通過物件指標呼叫成員函式時,到底呼叫那個函式要根據指標的原型來確定,而不是根據指標實際指向的物件型別確定。

由第1條所規定的限定範圍內,使用了virtual就是讓處理基礎類別物件的程式**能夠通透的繼續適當地處理衍生類物件。

#include using namespace std; 

class a

virtual void bar()

}; class b: public a

void bar()

}; int main()

aptr->foo()輸出結果是:

b』s foo()//多型性

a』s foo()//執行a::foo();

b』s bar()//雖然呼叫的是這個函式:a::foo(); 但隱式傳入的還是bobj 的位址,所以再次呼叫bar();呼叫時還是會呼叫b的函式, 與虛函式指標有關

aobj.foo()輸出結果是:

a』s foo()

a』s bar()

最後總結一下:

父類a指標a 指向 子類b物件b時,呼叫c方法:

b.a::c

1.如果此方法為虛函式

首先在a裡尋找此方法,如果沒有找到則到a的父類中尋找。

2.如果此方法為普通函式

使用a中的方法。

a->c

1.如果此方法為虛函式

首先在b裡尋找此方法,如果沒有找到則到b的父類中尋找。

2.如果此方法為普通函式

使用a中的方法。

b.c1.如果此方法為虛函式

首先在b裡尋找此方法,如果沒有找到則到b的父類中尋找。

2.如果此方法為普通函式

使用b中的方法。

c 父類指標指向子類物件

父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...

c 父類指標指向子類物件

父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...

父類指標指向子類物件的理解

虛函式 父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師...