組合與繼承(類與類之間三大關(guān)系)
復合(composition)
復合表示has-a洪乍,表示一個類里含有另一個類的對象(A擁有B)炬太,也稱包含關(guān)系谣妻。
template
class queue
{
...
protected:
deque c;? //底層容器
public:
bool empty() const { return c.empty();}//下列函數(shù)完全利用c類的操作函數(shù)完成
size_type size() const { return c.size();}
reference front() { return c.front();}
reference back() { return c.back();}
};
復合關(guān)系下的構(gòu)造和析構(gòu)
構(gòu)造:構(gòu)造是由內(nèi)而外胞锰,就像打包裹们颜,從里往外。container的構(gòu)造函數(shù)首先調(diào)用components的default構(gòu)造函數(shù)衅澈,然后才執(zhí)行自己键菱。(紅色部分是編譯器自動完成的)
Container::Container(...):Component(){...};
析構(gòu):析構(gòu)是由外而內(nèi),就像拆包裹矾麻,從外往里纱耻。Container的析構(gòu)函數(shù)首先執(zhí)行自己,然后才調(diào)用components的析構(gòu)函數(shù)险耀。
Container::~Container(){~Component();}
委托(delegation)composition by reference
委托:表示一個類里含有另一個類的指針或者引用對象弄喘。(生命不同,前面composition是一起創(chuàng)建一起結(jié)束甩牺,這里的delegation先創(chuàng)建string再等到需要時創(chuàng)建string)
class String
{
private:
StringRep* rep;? //pimml? handle and body 編譯防火墻
};
編譯防火墻:一個類提供接口蘑志,具體實現(xiàn)由另一個類來完成,兩個類為委托關(guān)系,后一個類改變內(nèi)容不影響前面(接口)急但。假如多個委托關(guān)系澎媒,A想改變內(nèi)容,B波桩、C共享以前的東西戒努,(copy on write )給一個副本寫。
繼承(inheritance)
繼承表示is-a镐躲,表示派生類對象也可以是一個基對象储玫,可以對基類對象執(zhí)行的任何操作,也可以對派生類對象執(zhí)行萤皂。(C++ primer plus)? 小指向大撒穷,子類指向父類
struct _List_node_base
{
_List_node_base* _M_next;
_List_node_base* _M_prev;
};
template
struct _List_node
: public _List_node_base{_Tp _M_data;};
C++有三種繼承方式:共有繼承(使用最多)、保護繼承裆熙、私有繼承端礼。(java只有共有繼承)
繼承關(guān)系下的構(gòu)造和析構(gòu)
構(gòu)造:繼承關(guān)系下的構(gòu)造由內(nèi)而外。Derived的構(gòu)造函數(shù)首先調(diào)用Base的default構(gòu)造函數(shù)入录,然后才執(zhí)行自己蛤奥。
析構(gòu):析構(gòu)由外而內(nèi)。Derived的析構(gòu)函數(shù)首先執(zhí)行自己纷跛,然后才調(diào)用Base的析構(gòu)函數(shù)喻括。
虛函數(shù)與多態(tài)
虛函數(shù)
任何成員函數(shù)前加上virtual后都稱為虛函數(shù)
non-virtual函數(shù):非虛函數(shù),不希望這個函數(shù)子類重新定義(override贫奠,復習)它。
virtual函數(shù):虛函數(shù)望蜡,你希望子類重新定義唤崭,而且父類中已經(jīng)默認定義過這個函數(shù)。
pure virtual函數(shù): 純虛函數(shù)脖律,你希望子類一定要重新定義且父類中并無默認定義谢肾。
例子如下:
class Shape
{
public:virtualvoid draw( ) const= 0;? //純虛函數(shù)virtualvoid error( const std::string& msg);? //虛函數(shù)
int objectID( ) const;? //非虛函數(shù)
...
};
class Rectangle: public Shape {...};
class Ellipse:public Shape{...};
Template Method
繼承+復合關(guān)系下的構(gòu)造和析構(gòu)
構(gòu)造由內(nèi)而外
Derived的構(gòu)造函數(shù)首先調(diào)用Base的default構(gòu)造函數(shù),然后調(diào)用component的default構(gòu)造函數(shù)小泉。
析構(gòu)由外而內(nèi)
Derived的析構(gòu)函數(shù)首先執(zhí)行自己芦疏,然后調(diào)用component的析構(gòu)函數(shù),然后調(diào)用Base的析構(gòu)函數(shù)微姊。