(2)示例代码当子类与父类出现同名的成员,如何通过子类对象,访问到子类或者父类中的同名的数据?
①访问子类同名成员,直接访问即可
②访问父类同名成员,需要加作用域
③如果子类中出现和父类同名的成员函数,编译器会隐藏掉父类中的所有同名成员函数
#include
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 s1;
cout << "m_A=" << s1.m_A << endl; //输出结果为200,即Son子类中的同名成员
cout << "m_A=" << s1.Base::m_A << endl; //输出结果为100,即Base父类中的同名成员
//同名函数处理方式
Son s2;
s2.func(); //输出为Son中的同名函数func()的调用
s2.Base::func(); //输出为Base中的同名函数func()的调用
s2.func(100); //会报错,如果子类中出现和父类同名的成员函数,编译器会隐藏掉父类中的所有同名成员函数
s2.Base::func(100); //加上作用域后访问成功
}
int main()
{
test01();
system("pause");
return 0;
}
二、继承同名静态函数成员处理方式
(1)注意事项
①静态数据成员和静态成员函数的声明是在普通数据成员和普通成员函数声明前加上static
②类的所有对象共享静态数据成员,因此无论建立多少个类的对象,静态数据成员只有一个副本
③静态数据成员在类内声明,在类外初始化
④静态数据成员和静态成员函数也有public、private和protected之分
⑤静态数据成员和静态函数只属于一个类,因而没有this指针,因此可以通过类名::静态函数(实参表)的方式调用
⑥在静态成员函数中访问非静态成员必须明确该静态成员函数作用于那个对象上
(2)示例代码继承中同名的静态成员在子类对象上如何进行访问?
①访问子类同名成员,直接访问即可
②访问父类同名成员,需要加作用域
③如果子类中出现和父类同名的成员函数,编译器会隐藏掉父类中的所有同名成员函数
#include
using namespace std;
//继承中的同名静态成员处理方式
class Base
{
public:
static void func()
{
cout << "Base下的func()函数调用" << endl;
}
static void func(int a)
{
cout <<"Base下的func(int a)函数调用" << endl;
}
static int m_A;
};
//静态成员类内声明类外初始化
int Base::m_A = 100;
class Son:public Base
{
public:
static void func()
{
cout << "Son下的func()函数调用" << endl;
}
static int m_A;
};
int Son::m_A = 200;
void test01()
{
//1、同名静态属性处理方式
Son s1;
//①通过对象访问
cout << "通过对象访问" << endl;
cout << "m_A=" << s1.m_A << endl; //输出结果为200,即Son子类中的同名成员
cout << "m_A=" << s1.Base::m_A << endl; //输出结果为100,即Base父类中的同名成员
//②通过类名访问
cout << "通过类名访问" << endl;
cout << "m_A=" << Son::m_A << endl; //输出结果为200,即Son子类中的同名成员
cout << "m_A=" << Base::m_A << endl; //输出结果为100,直接通过父类作用域访问
cout << "m_A=" << Son::Base::m_A << endl; //输出结果为100,通过子类中的对象访问父类作用域中的成员
//2、同名函数处理方式
Son s2;
//①通过对象访问
s2.func(); //输出为Son中的同名静态函数func()的调用
s2.Base::func(); //输出为Base中的同名静态函数func()的调用
s2.func(100); //会报错,如果子类中出现和父类同名的成员函数,编译器会隐藏掉父类中的所有同名成员函数
s2.Base::func(100); //加上作用域后访问成功
//②通过类名访问
Son::func(); //输出为Son中的同名静态函数func()的调用
Base::func(); //通过Base类名直接访问作用域下的func()函数
Son::Base::func(); //通过子类的类名访问父类作用域下的func()函数
}
int main()
{
test01();
system("pause");
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)