1. 程式人生 > >對用父類指標(或引用)指向父類物件和子類物件時,從而用父類指標或者引用訪問成員時的深刻理解;

對用父類指標(或引用)指向父類物件和子類物件時,從而用父類指標或者引用訪問成員時的深刻理解;

賦值相容規則永遠不變,父類指標既可以指向父類物件,也可以指向子類物件;當父類指標指向父類物件時,訪問父類的成員;當父類指標指向子類物件時,那麼只能訪問子類中從父類繼承下來的那部分成員;不能訪問子類獨有的成員,如果訪問,編譯階段會報錯;

函式隱藏(將父類的成員隱藏,通過子類物件或者在子類內部只能訪問子類的同名成員;但是父類的成員仍然存在),是指當子類中有和父類同名的成員變數時,此時子類中有兩個名字相同的成員變數;那麼如果此時我們用父類指標指向子類物件,來訪問父子類中名字相同的成員變數時,由於賦值相容規則,此時絕對訪問的是繼承來的父類的同名成員變數,但是,如果我們在子類內部或者用子類的物件在子類外部訪問此同名成員,此時編譯器會將父類的成員隱藏,子類物件訪問到的是自己類中重新定義的成員

;對於成員函式來說,只要構成了隱藏機制,訪問效果也一樣;

多型是指;當子類中重寫了父類的虛擬函式,那麼通過父類的指標或者引用指向父類物件或著子類物件;用該父類指標或者引用呼叫父子中被重寫的函式;就會有父類指標指向父類物件,呼叫的是父類中的虛擬函式;父類指標指向的是子類物件,呼叫的是子類虛擬函式;此時,也符合賦值相容規則;不貴父類的指標或者引用指向父類物件或者子類物件;這個父類指標或者引用都只能訪問父類的部分

指向父類的物件時,由於本身是父類指標;且父類物件模型中的虛擬函式表指標所指向的虛擬函式表中只存放父類的虛擬函式地址;所以父類的指標呼叫的重寫虛擬函式時父類的虛擬函式

但是當父類指標指向子類物件時,此時子類物件中的父類的虛擬函式表指標所指的虛擬函式表中的父類重寫虛擬函式的地址被改寫為子類的重寫虛擬函式的地址,所以此時父類指標訪問子類中父類的虛擬函式表時,找到的要呼叫的同名虛擬函式是子類的同名虛擬函式地址;所以父類指標呼叫子類的重寫的同名虛擬函式;

虛擬函式重寫(覆蓋)的實質就是重寫父類虛擬函式表中的父類虛擬函式地址;