繼承中出現同名成員處理方式

當子類與父類出現同名的成員時,如何通過子類對象訪問到父類中同名的數據了?
 

1.非靜態成員同名

  • 訪問子類同名成員  直接訪問即可
  • 訪問父類同名成員  需要加作用域
#include<iostream>
using namespace std;
//繼承方式
class Base
{
public:
	Base()
	{
		m_A=100;
	}
	void func()
	{
		cout << "Base-func調用" << endl;
	}
	void func(int a)
	{
		cout << "Base-func(int a)調用" << endl;
	}
	int m_A;
};

class Son :public Base
{
public:
	Son()
	{
		m_A = 200;
	}
	void func()
	{
		cout << "Son-func調用" << endl;
	}
	int m_A;
};

//同名成員屬性處理方式
void test01()
{
	Son s;
	cout << s.m_A << endl;
	//如果通過子類對象,訪問到父類中同名成員,需要加作用域
	cout << 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;
}

 

2.靜態成員同名

靜態成員和非靜態成員出現同名,處理方式一致:

  • 訪問子類同名成員  直接訪問即可
  • 訪問父類同名成員  需要加作用域

但是,靜態成員處理方式有兩種訪問方式

  • 通過對象訪問
  • 通過類名訪問
#include<iostream>
using namespace std;
//繼承中的同名靜態成員處理方式

//靜態成員特性:編譯階段分配內存,所有對象共享同一份數據,類內申明,類外初始化

class Base
{
public:
	
	static int m_A;    //靜態成員可以通過對象以及類名兩種方式訪問  非靜態成員只能通過對象訪問

	static void func()
	{
		cout << "Base static func" << endl;
	}

	static void func(int a)
	{
		cout << "Base static func(int a)" << endl;
	}
};
int Base::m_A = 100;
class Son :public Base
{
public:

	static int m_A;

	static void func()
	{
		cout << "Son static func" << endl;
	}
};
int Son::m_A = 200;
//同名成員屬性處理方式
void test01()
{
	//1.通過對象訪問
	cout << "通過對象訪問:" << endl;
	Son s;
	cout << s.m_A << endl;
	//如果通過子類對象,訪問到父類中同名成員,需要加作用域
	cout << s.Base::m_A << endl;

	//2.通過類名訪問
	cout << "通過類名訪問:" << endl;
	cout << Base::m_A<<endl;        //非靜態成員只能通過對象訪問
	cout << Son::Base::m_A << endl;   //Son表示類名,Base表示作用域  第一個::表示通過類名方式訪問,第二個::表示父類作用域下
}

//同名成員函數處理
void test02()
{
	//1.通過對象訪問
	cout << "通過對象訪問:" << endl;
	Son s;
	s.func();
	//如果通過子類對象,訪問到父類中同名成員,需要加作用域
	s.Base::func();

	//2.通過類名訪問
	cout << "通過類名訪問:" << endl;
	Base::func();       //非靜態成員只能通過對象訪問
	Son::Base::func();   //Son表示類名,Base表示作用域  第一個::表示通過類名方式訪問,第二個::表示父類作用域下

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

 

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