c++隨記二(黑馬程序員學習筆記)(繼承篇)

25、繼承語法:class 子類(派生類):public(繼承方式) 父類(基類)。繼承方式有公共繼承、保護繼承、私有繼承三種。

26、父類中所有非靜態的成員屬性都會被繼承下去,父類中私有的成員屬性是被編譯器隱藏了雖然訪問不到但是會繼承下去。可以用開發人員命令提示工具查看對象模型,先跳轉到具體路徑下,cl /d1 reportSingleClassLayout類名 文件名。

27、構造和析構的順序,先構造父類再構造子類,析構與構造相反。

28、繼承中,同名成員問題。子類對象可以直接訪問到子類中的同名成員。子類對象加作用域可以訪問父類同名成員。當子類與父類擁有同名的成員函數,子類會隱藏父類中的同名成員函數,加作用域可以調用。

#include<iostream>
using namespace std;
class Base
{
public:
	Base()
	{
		m_A = 100;
	}
	void func()
	{
		cout << "Base下的成員函數" << endl;
	}
	void func(int a)
	{
		cout << "Base下的成員函數(int a)" << endl;
	}
	int m_A;
};
class Son :public Base
{
public:
	Son()
	{
		m_A = 200;
	}
	void func()
	{
		cout << "Son下的成員函數" << endl;
	}
	int m_A;
};
//同名成員屬性
void test01()
{
	Son s;
	cout << "Son 下m_A= " << s.m_A << endl;
	//如果通過子類對象訪問到父類中的同名成員,需要加作用域
	cout << "Base 下m_A= " << s.Base::m_A << endl;

}
//同名成員函數
void test02()
{
	Son s;
	s.func();
	s.Base::func();
	//如果子類中出現和父類同名的成員函數,子類的同名成員會隱藏掉父類中所有同名成員函數
	//如果想訪問到父類中被隱藏的同名成員函數,需要加作用域。
	s.Base::func(100);
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

29、靜態同名成員訪問同28,只是除了通過對象訪問還可以通過類名來訪問。

 

 

30、繼承多個類的語法。class 子類:繼承方式 父類1,繼承方式 父類2...在實際應用中,不建議使用多繼承。當父類中出現同名成員,需要加作用域以區分。

31、菱形繼承(鑽石繼承)。兩個派生類同時繼承一個基類,又有個類D同時繼承兩個派生類。產生問題:(1)兩個派生類同時繼承基類數據,類D使用數據時會產生二義性;(2)類D繼承了兩份基類數據,其實只需要一份。

解決方法:(1)添加不同作用域(2)使用虛繼承。在繼承前加上virtual關鍵字。class XXX: virtual public XXX。虛繼承並不是繼承的數據,而是繼承的一個指針,通過指針偏移量找到唯一數據,使得數據只有一份。

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