寻雍尊师隐居 唐朝·李白
群峭碧摩天,逍遥不记年。拨云寻古道,倚石听流泉。花暖青牛卧,松高白鹤眠。语来江色暮,独自下寒烟。
当子类与父类出现同名的成员,如何通过子类对象,访问子类或父类中同名的成员呢?
普通成员
- 访问子类同名成员,直接通过子类对象访问即可。
- 访问父类同名成员,需要通过子类对象家作用域。
- 当子类与父类有同名的成员函数,子类会隐藏父类中同名的成员函数,不管是否是重载的,加作用域可以访问。
code:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
m_a = 10;
}
void info()
{
cout << "Base info" << endl;
}
void info(int a)
{
cout << "Base info(int a)" << endl;
}
int m_a;
};
class Son : public Base
{
public:
Son()
{
m_a = 100;
}
void info()
{
cout << "Son info" << endl;
}
int m_a;
};
int main()
{
Son s1;
// 同名成员属性访问,子类属性直接使用,父类的同名属性要加作用域
cout << "s1.m_a = " << s1.m_a << endl;
cout << "s1.Base::m_a = " << s1.Base::m_a << endl;
// 同名成员函数调用,子类方法直接使用,父类的要加作用域
s1.info();
s1.Base::info();
//s1.info(10); // 当子类和父类中有同名的方法时,子类的同名成员函数会隐藏父类中所有的同名成员函数,不管参数
s1.Base::info(10);
system("pause");
return 0;
result:
s1.m_a = 100
s1.Base::m_a = 10
Son info
Base info
Base info(int a)
}
静态成员
- 静态成员和非静态成员出现同名,处理方式一致。
- 注意在使用类名访问静态成员时的冒号含义,Son::Base::m_a // 第一个::表示通过类名的方式访问,第二个::访问父类作用域
code:
#include <iostream>
using namespace std;
class Base
{
public:
static int m_a;
static void info()
{
cout << "Base info" << endl;
}
};
int Base::m_a = 10;
class Son: public Base
{
public:
static int m_a;
static void info()
{
cout << "Son info" << endl;
}
};
int Son::m_a = 100;
int main()
{
Son s1;
// 静态成员,通过对象访问,同名成员属性访问,子类属性直接使用,父类的同名属性要加作用域
cout << "s1.m_a = " << s1.m_a << endl;
cout << "s1.Base::m_a = " << s1.Base::m_a << endl;
// 静态成员,通过类名访问,同名成员属性访问,子类属性直接使用,父类的同名属性要加作用域
cout << "Son::m_a = " << Son::m_a << endl;
cout << "Base::m_a = " << Base::m_a << endl; // 直接通过Base访问
cout << "Base::m_a = " << Son::Base::m_a << endl; // 第一个::表示通过类名的方式访问,第二个::访问父类作用域
// 同名成员函数调用,通过对象访问,子类方法直接使用,父类的要加作用域
s1.info();
s1.Base::info();
// 同名成员函数调用,通过类名访问,子类方法直接使用,父类的要加作用域
Son::info();
Son::Base::info();
system("pause");
return 0;
result:
s1.m_a = 100
s1.Base::m_a = 10
Son::m_a = 100
Base::m_a = 10
Base::m_a = 10
Son info
Base info
Son info
Base info
}