class y
class x : public y
x one;
建構函式的呼叫順序是下面的順序:
y(); // 基類的建構函式
x(); // 繼承類的建構函式
對於多基類的情況,下面是乙個例子:
class x : public y, public z
x one;
建構函式以宣告的次序呼叫。
y(); // 基類建構函式首先被呼叫
z();
x();
虛基類的建構函式在任何非虛基類建構函式前呼叫。如果構造中包括多個虛基類,它們的呼叫順序以宣告順序為準。如果虛類是由非虛類派生而來,那非虛類的建構函式要先被呼叫。下面是乙個例子:
class x : public y, virtual public z
x one;
呼叫順序如下:
z(); // 虛基類初始化
y(); // 非虛基類
x(); // 繼承類
下面是乙個複雜的例子:
class base;
class base2;
class level1 : public base2, virtual public base;
class level2 : public base2, virtual public base;
class toplevel : public level1, virtual public level2;
toplevel view;
構造函式呼叫順序如下:
base(); // 虛基類僅被構造一次
base2();
level2(); // 虛基類
base2();
level1();
toplevel();
如果類繼承中包括多個虛基類的例項,基類只被初始化一次。
1、如果類裡面有成員類,成員類的建構函式優先被呼叫;
2、建立派生類的物件,基類的建構函式函式優先被呼叫(也優先於派生類裡的成員類);
3、 基類建構函式如果有多個基類則建構函式的呼叫順序是某類在類派生表中出現的
順序而不是它們在成員初始化表中的順序;
4、成員類物件建構函式如果有多個成員類物件則建構函式的呼叫順序是物件在類中
被宣告的順序而不是它們出現在成員初始化表中的順序;
5、派生類建構函式
作為一般規則派生類建構函式應該不能直接向乙個基類資料成員賦值而是把值傳遞
給適當的基類建構函式否則兩個類的實現變成緊耦合的(tightly coupled)將更加難於
正確地修改或擴充套件基類的實現。(基類設計者的責任是提供一組適當的基類建構函式)
C 構造函式呼叫順序
1 建立派生類的物件,基類的建構函式函式優先被呼叫 也優先於派生類裡的成員類 2 如果類裡面有成員類,成員類的建構函式優先被呼叫 3 基類建構函式如果有多個基類則建構函式的呼叫順序是某類在類派生表中出現的 順序而不是它們在成員初始化表中的順序 4 成員類物件建構函式如果有多個成員類物件則建構函式的呼...
構造函式呼叫順序
1 建立派生類的物件,基類的建構函式函式優先被呼叫 也優先於派生類裡的成員類 2 如果類裡面有成員類,成員類的建構函式優先被呼叫,靜態成員優先呼叫 3 基類建構函式如果有多個基類則建構函式的呼叫順序是某類在類派生表中出現的 順序而不是它們在成員初始化表中的順序 4 成員類物件建構函式如果有多個成員類...
C 建構函式析構函式呼叫順序
在使用建構函式和析構函式時,需要特別注意對它們的呼叫時間和呼叫順序。在一般情況下,呼叫析構函式的次序正好與呼叫建構函式的次序相反 最先被呼叫的建構函式,其對應的 同一物件中的 析構函式最後被呼叫,而最後被呼叫的建構函式,其對應的析構函式最先被呼叫。簡單來說,其建構函式的順序就一句話 基類建構函式 成...