class base11
virtual int get()
public:
int m_i;
};class subclass : public base11
virtual int get()
public:
int m_j;
};int main()
base11* p = 0;
subclass q;
p = &q;
int (*fun)() = null;
fun = (int(*)())((*(unsigned int**)&q)[0]);//unsigned int ** 將&q變成了指向乙個陣列的指標,並且這個陣列的元素還是指標;*(unsigned int**)&q,的作用是取這個陣列的第乙個元素,取出來還是位址,也可以認為是乙個指標,指向了虛函式表,同時虛函式表也是乙個陣列,((*(unsigned int**)&q)[0]虛函式表中的第乙個元素,這個元素同樣是個指標,指向了成員函式的位址
fun();
**:
虛函式 以及覆蓋
虛函式以及覆蓋 class a 分析class a中宣告乙個虛函式 f 派生類中class b 對這個虛函式進行了覆蓋,重新定義。a pa new a 中申明乙個a類得指標,並宣告乙個物件。所以 pa f 結果應該為 a b pb b pa 把基類a的指標轉化為派生類b的指標pb 但是pa並沒有變化...
C 中虛函式,純虛函式以及多型
關於建構函式和析構函式 在整理排序演算法的時候想到可以藉此熟悉一下類的構造以及繼承等知識點,就寫了乙個排序基類宣告乙個排序函式,然後寫多個排序演算法的子類重寫這個排序函式,過程中順便研究了一下virtual和多型的概念。首先回顧一下虛函式和純虛函式的八股文,虛函式是多型的實現機制,宣告乙個虛函式就是...
成員函式呼叫虛函式
在乙個基類或派生類的成員函式中可以直接呼叫該類等級中的虛函式,例如 class a void act2 virtual void act3 virtual void act4 void act5 void act4 void act5 在上例情況下,this指向b,所以a act2 呼叫b act3...