一、包含關係
當乙個類構建的物件為另乙個類的成員物件時:
當乙個型別包含另乙個物件時,本類沒有構造,析構,拷貝,賦值,但成員類有這些函式,本類就可以進行自己的合成因此來調動成員物件的函式。要和成員物件的行為保持一致。
class object
~object()
object(const object& obj) :value(obj.value)
object& operator=(const object& obj)
cout << "object::賦值" << this << endl;
return *this;
}};class base
~base()
base(const base& base) :num(base.num),obj(base.obj)
base& operator=(const base& base)
cout << "base::賦值" << this << endl;
return *this;
}};int main()
二、繼承關係
當乙個類繼承另乙個類時:
拷貝構造:
①無論基類寫或不寫拷貝或賦值函式,子類沒寫時都會進行合成,(注意若子類寫了拷貝函式,在呼叫基類的拷貝構造,要寫明(object(base)))
②基類沒有拷貝函式,子類有拷貝函式。不可以讓父進行合成,只能調動建構函式來建立base2的隱藏父物件。
即:對於拷貝建構函式來說,基類可以約束子類進行合成,反過來,子類不能約束基類進行合成
賦值函式
①基類沒有,子類也沒有:正常賦值,將base1的值全部給base3。
②基類沒有,子類有:只能賦值子物件的成員屬性。
③基類有,子類沒有:會約束子類產生賦值語句,正常賦值,基類和父類物件的屬性都會賦值。
④基類有,子類也有:子類的賦值語句無法調動父類的賦值語句,只能賦值子物件的成員屬性。
class object
~object()
object(const object& obj) :value(obj.value)
object& operator=(const object& obj)
cout << "object::賦值" << this << endl;
return *this;
}};class base:public object
~base()
base(const base& base) :num(base.num),object(base)
base& operator=(const base& base)
cout << "base::賦值" << this << endl;
return *this;
}};int main()
c 11 繼承構造
define crt secure no warnings include include include include c 11允許派生類繼承基類的建構函式 預設建構函式 複製建構函式 移動建構函式除外 注意 繼承的建構函式只能初始化基類中的成員變數,不能初始化派生類的成員變數 如果基類的建構函...
C 11包擴充套件
c 11的包擴充套件,記錄一下 吧,採用萬能引用,萬能引用再配合std forward又是完美 我個人還是覺得能清晰表達 盡量不要用這麼奇奇怪怪的語句吧?完美 可以考慮,確實降低的拷貝的成本。今天在github看乙個人執行緒池的demo,發現他的執行緒池裡充滿了這些奇奇怪怪的寫法,明明是乙個普普通通...
C 11 繼承建構函式
繼承建構函式 基類有多個不同版本的建構函式,子類必須對應建構函式來進行 透傳 如 class base base double d,int i void fun float d class derived public base derived double d,int i base d,i voi...