第17章 用於大型程式的工具 14

2021-12-29 20:59:47 字數 2242 閱讀 5727

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...