1.虛擬繼承 --繼承了多個基類實例, 但只需要一份單獨的共享實例
2.對于一個類的基類的數目, c++沒有限制(可以多繼承)
兩個基類是最常見的, 一個基類常常用于表示一個共有抽象接口, 第二個基類提供是有的實現
從第三個或更多個直接基類繼承而來的派生類遵循mixin-based設計風格
3.基類構造函數被調用的順序以派生表中聲明的順序為準
4.在多繼承下, 派生類可以從兩個或者更多個基類中繼承同名的成員 --直接訪問是二義的, 將導致編譯時刻錯誤, 所以要顯示指明調用哪個基類的哪個成員 Base::member
5.public派生被稱為類型繼承(type inheritance) --派生類是基類的子類型
提供了較一般的基類的一種特化
6.private派生被稱為實現繼承(implementation hinheritance) --派生類不直接支持基類的公有接口, 提供了自己的公有接口, 重用基類的實現
private基類放映了一種"并非基于子類型關系"的繼承形式, 基類的整個公有接口在派生類中變成private
7.對于is-a子類型關系來說, public繼承是一個很有利的機制
8.has-a關系一般由組合(composition)而不是繼承來支持 --使一個類稱為另一個類的成員
a:如果我們希望改寫一個類的虛擬函數, 則必須使用私有繼承而不是使用組合
b:如果我們希望一個類能夠引用"一個包含多種可能類型的層次結構"中的一個類, 那么就必須通過引用使用組合
c:如果只是希望簡單的重用實現, 則按值組合比繼承更好
d:如果希望對象的遲緩型分配, 按引用(使用一個指針)組合通常是一個不想的設計選擇
9.免除(exempting)個別成員的私有繼承影響
以私有方式繼承, 基類的所有protected和public成員全被繼承為子類的私有成員
類設計者可以針對基類的個別成員, 是其免除非公有派生的影響:
class CSub: private CBase {
public:
using CBase::Member;
};
免除個別成員的另一個原因是允許后續的派生類訪問私有基類的protected成員
派生類只能將繼承得到的成員恢復到原來的訪問級別, 該訪問級別不能比基類中原來指定的級別更嚴格或更不嚴格
10.protected繼承 --基類的所有公有成員都成為派生類的protected成員
11.對象組合有兩種形式
a:按值組合(Composition by value)
b:按引用組合(Composttion by reference)
12.虛擬繼承(virtual inheritance) --在虛擬繼承下, 只有一個共享的基類子對象被繼承, 而無論該基類在派生層次中出現多少次
共享的基類子對象被稱為虛擬基類(vitual base class)
在虛擬繼承下, 基類子對象的復制及由此引起的二義性都被取消了
13.虛擬繼承的語法:
CSub: public virtual CBase1, public virtual CBase2 {...};
virtual 和 public的順序不重要
2.對于一個類的基類的數目, c++沒有限制(可以多繼承)
兩個基類是最常見的, 一個基類常常用于表示一個共有抽象接口, 第二個基類提供是有的實現
從第三個或更多個直接基類繼承而來的派生類遵循mixin-based設計風格
3.基類構造函數被調用的順序以派生表中聲明的順序為準
4.在多繼承下, 派生類可以從兩個或者更多個基類中繼承同名的成員 --直接訪問是二義的, 將導致編譯時刻錯誤, 所以要顯示指明調用哪個基類的哪個成員 Base::member
5.public派生被稱為類型繼承(type inheritance) --派生類是基類的子類型
提供了較一般的基類的一種特化
6.private派生被稱為實現繼承(implementation hinheritance) --派生類不直接支持基類的公有接口, 提供了自己的公有接口, 重用基類的實現
private基類放映了一種"并非基于子類型關系"的繼承形式, 基類的整個公有接口在派生類中變成private
7.對于is-a子類型關系來說, public繼承是一個很有利的機制
8.has-a關系一般由組合(composition)而不是繼承來支持 --使一個類稱為另一個類的成員
a:如果我們希望改寫一個類的虛擬函數, 則必須使用私有繼承而不是使用組合
b:如果我們希望一個類能夠引用"一個包含多種可能類型的層次結構"中的一個類, 那么就必須通過引用使用組合
c:如果只是希望簡單的重用實現, 則按值組合比繼承更好
d:如果希望對象的遲緩型分配, 按引用(使用一個指針)組合通常是一個不想的設計選擇
9.免除(exempting)個別成員的私有繼承影響
以私有方式繼承, 基類的所有protected和public成員全被繼承為子類的私有成員
類設計者可以針對基類的個別成員, 是其免除非公有派生的影響:
class CSub: private CBase {
public:
using CBase::Member;
};
免除個別成員的另一個原因是允許后續的派生類訪問私有基類的protected成員
派生類只能將繼承得到的成員恢復到原來的訪問級別, 該訪問級別不能比基類中原來指定的級別更嚴格或更不嚴格
10.protected繼承 --基類的所有公有成員都成為派生類的protected成員
11.對象組合有兩種形式
a:按值組合(Composition by value)
b:按引用組合(Composttion by reference)
12.虛擬繼承(virtual inheritance) --在虛擬繼承下, 只有一個共享的基類子對象被繼承, 而無論該基類在派生層次中出現多少次
共享的基類子對象被稱為虛擬基類(vitual base class)
在虛擬繼承下, 基類子對象的復制及由此引起的二義性都被取消了
13.虛擬繼承的語法:
CSub: public virtual CBase1, public virtual CBase2 {...};
virtual 和 public的順序不重要


class a
{
public:
bool bstatus;
void aa1(){}
void aa2(){}
};
class b : virtual private a
{
public:
a::bstatus;//回傳false or true
};
class c : virtual private a
{
public:
a::bstatus;//回傳false or true
};
class d : puclib b, public c
{
//當這邊用到bstatus 會產生ambiguous
}
請問有什麼方法可以避免嗎?
class d : public b, public c
{
public:
b::bstatus; //或者c::bstatus;
};
這樣就避免了ambiguous引用
假設想要class a, class b, class c 和class d 都要共用class a的bStatus
(class a其他的成員資料或函式都private inheritance起來只留bStatus
給inheritance的class共用)
請問這樣有方法嗎?
謝謝
#include <iostream>
using namespace std;
class a
{
public:
bool bstatus;
a(){
bstatus = false;
cout << "class a:bstatus value address " << &bstatus <<endl;
}
void aa1(){}
void aa2(){}
};
class b : virtual private a
{
public:
a::bstatus;//回傳false or true
b(){
cout << "class b:bstatus value address " << &bstatus <<endl;
}
};
class c : virtual private a
{
public:
a::bstatus;//回傳false or true
c(){
cout << "class c:bstatus value address " << &bstatus <<endl;
}
};
class d : private b, private c
{
public:
b::bstatus; //或者c::bstatus 效果一樣
d(){
cout << "class d:bstatus value address " << &bstatus <<endl;
}
};
int main()
{
d obj;
cout << obj.bstatus <<endl;
return 0;
}
輸出結果:
class a:bstatus value address 0012FF7C
class b:bstatus value address 0012FF7C
class c:bstatus value address 0012FF7C
class d:bstatus value address 0012FF7C
0
-------------------
//bstatus內存地址一樣, 既class a, class b, class c, class d共用class a的bStatus