17.3.2 轉換與多個基類
在單個基類情況下,派生類的指標或引用可以自動轉換為基類的指標或引用,對於多重繼承也是如此,派生類的指標或引用可以轉換為其任意基類的指標或引用。
在多重繼承情況下,遇到二義性轉換的可能性更大。編譯器不會試圖根據派生類轉換來區別基類間的轉換,轉換帶每個基類都一樣好。
namespace andersoft
; class endangered{};
class bear:public zooanimal{};
class panda:public bear,public endangered
}; }
} namespace andersoft
; class endangered{};
class bear:public zooanimal{};
class panda:public bear,public endangered
}; }}
using namespace andersoft::animal;
int _tmain(int argc, _tchar* ar**)
using namespace andersoft::animal;
int _tmain(int argc, _tchar* ar**)
1. 多重繼承下的虛函式
2. 基於指標型別或引用型別的查詢
像單繼承一樣,用基類的指標或引用只能訪問基類中定義(或繼承)的成員,不能訪問派生類中引入的成員。
當乙個類繼承於多個基類的時候,那些基類之間沒有隱含的關係,不允許使用乙個基類的指標訪問其他基類的成員。
3. 確定使用哪個析構函式
假定所有根基類都將它們的析構函式適當定義為虛函式,那麼,無論通過哪種指標型別刪除物件,虛析構函式的處理都是一致的。
假定這些指標每個都指向子類物件,則每種情況下發生完全相同的析構函式呼叫次序。析構函式呼叫的次序是建構函式次序的逆序。
zooanimal *za=new panda();
delete za; //execute ~panda -> ~endangered -> ~bear
zooanimal *za=new panda();
delete za; //execute ~panda -> ~endangered -> ~bear17.3.3 多重繼承派生類的複製控制
多重繼承的派生類的逐個成員初始化、賦值和析構,表現得與單繼承下的一樣,使用基類自己的複製建構函式、賦值操作符或析構函式隱式構造、賦值或撤銷每個基類。
合成的賦值操作符的行為類似於複製建構函式。
合成的析構函式撤銷子類物件的每個成員,並且按建構函式次序的逆序為基類部分呼叫析構函式。
像單繼承的情況一樣,如果具有多個基類的類定義了自己的析構函式,該析構函式只負責清除派生類。如果派生類定義了自己的複製建構函式或賦值操作符,則類負責複製(賦值)所有的基類子部分。只有派生類使用複製建構函式或賦值操作符的合成版本,才自動複製或賦值基類部分。
17.3.4 多重繼承下的類作用域
當乙個類有多個基類的時候,通過所有直接基類同時進行名字查詢。多重繼承的派生類有可能從兩個或多個基類繼承同名成員,對該成員不加限定的使用是二義性的。
1. 多個基類可能導致二義性。
2. 首先發生名字查詢
即使兩個繼承的函式有不同的形參表,也會發生錯誤。類似地,即使函式在乙個類中是私有的而在另乙個類中是公有或受保護的,也是錯誤的。
3. 避免使用者級二義性
可以通過指定使用哪個類解決二義性。
避免潛在二義性最好的方法是,在解決二義性的派生類中定義函式的乙個版本。
namespace andersoft
}; class endangered
}; class bear:public zooanimal
}; class panda:public bear,public endangered
void print()
}; }
} namespace andersoft
};class endangered
};class bear:public zooanimal
};class panda:public bear,public endangered
void print()
};}}panda *za=new panda();
za->endangered::print();
za->print();
摘自 xufei96的專欄
第17章 用於大型程式的工具 14
17.3.2 轉換與多個基類 在單個基類情況下,派生類的指標或引用可以自動轉換為基類的指標或引用,對於多重繼承也是如此,派生類的指標或引用可以轉換為其任意基類的指標或引用。namespace animal class endangered class bear public zooanimal cl...
第17章 用於大型程式的工具 9
17.2.3 未命名的命名空間 命名空間可以使未命名的,未命名的命名空間 unnamed namespace 在定義時沒有給定名字。未命名的命名空間以關鍵字namespace開頭,接在關鍵字namespace後面的是由花括號定界的宣告塊。未命名的命名空間與其他命名空間不同,未命名的命名空間的定義區域...
第17章 用於大型程式的工具 10
17.2.4 命名空間成員的使用 除了在函式或其他作用域內部,標頭檔案不應該包含using指示或using宣告。在其頂級作用域包含using指示或using宣告的標頭檔案,具有將該名字注入包含該標頭檔案的檔案中的效果。標頭檔案應該只定義作為其介面的一部分的名字,不要定義在其實現中使用的名字。1.us...