@著作權歸作者所有:來自CSDN博客作者大鬍子的艾娃的原創作品,如需轉載,請註明出處https://blog.csdn.net/qq_43148810,否則將追究法律責任。
如有錯誤的地方歡迎指正,謝謝!
一、類型兼容性原則
類型兼容是指在公有派生的情況下,一個派生類對象可以作爲基類的對象來使用的情況。類型兼容又稱爲類型賦值兼容或類型適應。
二、在C++中,類型兼容主要指以下五種情況
1、派生類對象可以作基類對象使用(也可以理解爲公有繼承的原因)。
2、派生類對象可以初始化基類對象。
3、派生類對象可以賦值給基類對象。
4、派生類對象可以初始化基類的引用。
5、派生類對象的地址可以賦給指向基類的指針。
三、類型兼容演示
class parent
{
public:
void printf()
{
std::cout << "我是爸爸" << std::endl;
}
void printfp()
{
std::cout << "爸爸" << std::endl;
}
};
class child :public parent
{
public:
void printf()
{
std::cout << "我是兒子" << std::endl;
}
};
int main()
{
parent p1;
p1.printf();
child c1;
c1.printf();
//1.派生類對象調用基類中的函數,或者說公有繼承
c1.printfp();
//2.派生類對象可以初始化基類對象
parent p2 = c1;
p2.printf();
//3.派生類對象可以賦值給基類對象
p1 = c1;
p1.printf();
//4.派生類對象可以初始化基類的引用
parent &p3 = c1;
p3.printf();
//5、派生類對象的地址可以賦給指向基類的指針
parent *p = NULL;
p = &c1;
p->printf();
//錯誤提示
//p1.printfC(); 錯誤,基類中沒有子類成員printfC
//child c2 = p1;//不存在用戶定義的"parent"到"child"的適當轉換
//child c2; c2 = p1;//沒有與操作類型爲"child=parent"匹配的"="操作符
//child &c2 = p1;//無法用"parent"類型的值初始化"child &"類型的引用(非常量限定)
//child *c2 = NULL; c2 = &p1;//不能將"parent*"類型分配到"child*"類型的實體
}
//程序運行結果:
//我是爸爸
//我是兒子
//爸爸
//我是爸爸
//我是爸爸
//我是爸爸
//我是爸爸
四、類型兼容性質
1、由於公有派生類實際擁有了基類的所有成員,所以可以把派生類對象作爲基類對象來處理。
2、但是如果試圖通過基類指針引用只出現在派生類中才有的成員,則會出錯,因爲派生類中新增或者改造的成員是基類沒有的。
3、類型兼容規則是多態性的重要基礎之一。
4、派生類對象可以轉換爲基類對象,反之不行,但也大大的減輕了編寫代碼的負擔,提高了程序設計的效率。
五、爲什麼說類型兼容提高了程序設計的效率
//可將函數的參數設計成基類對象及其引用或者指針的形式
void display(parent &p)
{
p.printf();
}
根據C++類型兼容規則, p可以引用任何(直接和間接)parent 的公有派生類對象,指針同理,由C++編譯器實現隱式的類型轉換。
更多內容請關注個人博客:https://blog.csdn.net/qq_43148810