假如我們用類a生成乙個物件a,那麼由於物件a中只包含類a中的成員變數(當然不包含靜態變數)及乙個指向虛函式表的指標。還有,乙個指標只可以提供兩樣資訊:位址資訊及指標的型別。還有重要的一條:基類的指標可以指向派生類的物件,而派生類的指標是不允許指向基類物件的。
這樣,如果我們有乙個指向物件a的指標,由指標的位址資訊我們可以得到和改變成員變數及執行類中的虛函式,由指標的型別(就是生成指標的類)我們可以得到和改變類中的靜態變數及執行類中的非虛函式。
反過來說,要執行虛函式,必須通過物件(或指向該物件的指標)得到虛函式的入口位址;如果要執行非虛函式,由於物件中無法得到非虛函式的資訊,那只就需要從生成物件的類中得到非虛函式的入口位址。
這樣多型性就容易解釋得多了。
例如下面的程式,結果一定是輸出class a!。因為函式f()中執行是非虛函式,要根據指標k的型別來得到非虛函式的位址,指標k指向的物件不包含非虛函式的資訊。
#include "stdafx.h"
class a
};class b : public a
void f(a *k)
int main(int argc, char* argv)
再如下例,一定輸出:class b!。因為成員函式xx()成了虛函式,執行虛函式是要從物件中得到指向虛函式表的指標後才能執行。而現在的指標k指向的是物件b,而從物件b中得到的虛函式是類b重寫後的虛函式xx()。所以執行的是類b中的xx()。
#include "stdafx.h"
class a
};class b : public a
void f(a *k)
int main(int argc, char* argv)
同理,類中的靜態變數及非靜態變數的訪問同非虛函式及虛函式。
C 中多型理解
封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...
關於多型的理解
舉例一 做地圖框架,baidumapsdk 一 如果不用多型 1 2 是先後順序 架構師 2,呼叫程式設計師寫的功能 程式設計師 1,先寫功能 架構師求著程式設計師寫好功能,然後再調。二 如果用多型 架構師 1,寫介面bdlocationlistener,2,調口bdlocationlistener...
關於多型的理解
package com.sdjt.study.extend author lyy 汽車介面 inte ce car 寶馬 class bmw implements car public int getprice 奇瑞qq class cheryqq implements car public int...