C++之類型兼容

@著作權歸作者所有:來自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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章