建構函式和複製控制成員不能繼承,每個類定義自己的建構函式和複製控制成員,如果不自己定義,就將編譯器自動合成。如果類需要只希望派生類使用的特殊建構函式,這樣的建構函式應定義為protected。
派生類的合成預設建構函式的初始化時:
1.先呼叫派生類上一級的預設建構函式初始化
2.然後初始化本壘的資料成員
class bulk_item:public item_base
};隱式呼叫item_base的預設建構函式
向基類建構函式傳遞實參(初始化)
class bulk_itm:public item_base
};乙個類只能初始化直接基類,而不能跨越初始化
派生類的賦值操作符:若派生類自定義了自己的賦值操作符,則該操作必須對基類部分進行顯示賦值
derived &derived::operator=(const derived &rhs)
return *this;
}派生類析構函式不負責撤銷基類物件的成員,物件的撤銷順序與構造順序相反,首先執行派生類析構函式,然後按照繼承層次一次向上呼叫各級類析構函式
如果刪除基類指標,則需要執行基類析構函式並清除基類的成員。如果物件實際上是派生型別,則沒有定義該行動。故基類的析構函式應為虛函式,當析構函式為虛函式時,通過指標呼叫,執行哪個析構函式將返回指標物件型別的不同而不同(析構函式的性質將繼承)
class item_base
};item_base *itemp=new item_base; //same static and dynamic type
delete itemp; //ok:destructor for item_base called
itemp=new bulk_item; //ok:static and dynameic type differ
deleted itemp; //ok:destructor for bulk_item called
在複製控制成員中,只有析構函式定義為虛函式,其他不應定義為虛函式(構造,賦值) ,因為在每個類中都有自己的複製控制成員.
如果派生類想通過自身型別使用所有的過載版本,則派生類必須衝定義所有過載版本,要麼乙個也不重定義,因為派生類成員會遮蔽積累中相同名字的成員
派生類也可以不用重定義所繼承的每乙個基類版本,可以為過載成員函式名稱而作的using宣告,將該函式的所有過載例項加到派生的作用域
要獲得動態繫結,必須通過基類的引用或指標呼叫虛成員,虛函式在基類和派生類中擁有同一原型。如果不相同,則沒辦法通過基類型別的引用或指標引用派生類函式
class base
;class d1:public base
;class d2:public d1
;base bobj;
d1 d1obj;
d2 d2obj;
base *bp1=&bobj,*bp2=&d1.obj,*bp3=&d2obj;
bp1->fcn(); //ok will call base::fcn at run time
bp2->fcn(); //ok will call base::fcn at run time
bp3->fcn(); //ok will call base::fcn at run time
複製控制 複製建構函式
只有單個形參,而且該引數是對本類型別物件的引用。主要用於 1 根據另乙個同型別的物件顯示或隱式的初始化乙個物件 string a abc 呼叫複製建構函式將a初始化為abc string aa string 呼叫string 的建構函式,建立乙個新的物件,再呼叫 複製建構函式初始化aa string...
複製控制 複製建構函式
只有單個形參,而且該引數是對本類型別物件的引用。主要用於 1 根據另乙個同型別的物件顯示或隱式的初始化乙個物件 string a abc 呼叫複製建構函式將a初始化為abc string aa string 呼叫string 的建構函式,建立乙個新的物件,再呼叫 複製建構函式初始化aa string...
建構函式和複製控制成員
建構函式和複製控制成員不能繼承 即建構函式,析構函式,複製建構函式,賦值操作符 每個類定義自己的建構函式和複製控制成員。像任何類一樣,如果類不定義自己的預設建構函式和複製控制成員,就將使用合成版本。派生類建構函式 派生類的建構函式受繼承關係的影響,每個派生類建構函式除了初始化自己的資料成員之外,還要...