1、類的編譯順序,類的構造順序,子類構造順序,子類析構順序
類的編譯順序:類名 ---> 成員名 ---> 方法體
子類的構造順序:先構造父類,再構造子類
子類的析構順序:先析構子類,再析構父類
2、過載,隱藏,覆蓋
過載:1、作用域相同
2、函式名相同
3、引數列表不同
隱藏:子類隱藏父類同名的方法
覆蓋:子類覆蓋父類相同的虛成員方法
3、四種型別強轉
4、虛表什麼時候產生?存放在**?
在編譯期產生,存放在.rodata段
5、動多型、靜多型
靜多型:編譯期決定的多型,如:模板、過載
動多型:執行期間決定的多型,如:繼承中的多型
6、動多型呼叫的條件有什麼?
指標呼叫,或引用呼叫
該型別下的虛函式
物件完整
7、基類指標指向子類物件,指標是什麼型別?*指標是什麼型別?(基類中有虛函式)
父類:a 子類:b
指標:class a*型別
*指標:class b型別
class a
};class b : public a
};int main()
8、基類存在虛函式,子類覆蓋,子類的記憶體布局
9、基類無虛函式,子類有虛函式。將基類指標指向子類物件時,其指向子類物件中基類起始的部分。
10、基類定義虛函式和普通過載函式,子類定義同名函式隱藏普通函式和函式
class base
virtual void show(int i) };
class derive : public base
};int main()
11、基類指標指向堆上的子類物件,此時delete指標,子類析構函式未呼叫,有可能造成記憶體洩漏。基類析構函式應寫成虛函式12、基類構造清除所有資料,基類指標呼叫自己的虛函式,子類呼叫虛函式
class base
virtual void show() };
/*vfptr 00000000
*/class derive : public base
void show() };
int main()
13、基類和派生類的建構函式、析構函式中呼叫虛函式,不會產生多型呼叫 不會,因為此時物件不完整(物件在建構函式結束到析構函式之前是完整的)。
14、基類虛函式放到公有,派生類虛函式放到私有,外部基類指標指向子類物件,能否派生類私有函式否訪問?
可以,因為該指標是基類的指標,但是其又可以指向子類的示例,因此在呼叫之前(進入虛函式表中函式位址之前)無法確定呼叫的究竟是誰
class base
};class derive : public base
};int main()
15、基類和子類給不同的虛函式函式引數預設值,基類指標指向子類物件,呼叫函式。此時會呼叫子類的函式,但是函式的引數預設值是基類中函式的引數預設值
class base
};class derive : public base
};int main()
繼承與多型的相關題目
1.派生類記憶體布局,繼承了基類什麼東西?先是基類,後是派生類,並且繼承了名字作用域和除析構構造之外的所有方法 2.類的編譯程順序,構造順序,析構順序 類的編譯程式 先編譯類名 成員名 方法體 子類的構造順序 先構造父類,在構造子類 子類的析構順序 先析構子類,後析構父類,即先構造的後析構,後構造的...
C 多型 繼承多型
什麼是多型?個人理解為 在程式語言繼承關係中,子類能替代父類,表現出不同的行為。換句話說 在繼承關係中,乙個類被例項化被其子類替代,子類中有父類的虛方法重寫,或者有父類同名方法 new 呼叫相同方法時候,將表現出子類或者父類中不同行為 老闆,上 static void main string arg...
繼承和多型中常見的問題(一)
繼承和多型中常見的問題 一 一 繼承 的復用。繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。這樣做,也達到了重用 功能和提高執行時間的效果。1 繼承的方式 由於c 中有三種訪問限定符,public,private,protected.因此在類與類的繼承中也將有這三種方...