當子類與父類出現同名的成員時,如何通過子類對象訪問到父類中同名的數據了?
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;
}