一、程序及输出
1.1 同名成员变量
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
this->m_A = 10;
}
void func()
{
cout << "Base中的func调用" << endl;
}
void func(int a)
{
cout << "Base中的func(int)调用" << endl;
}
int m_A;
};
class Son :public Base
{
public:
Son()
{
this->m_A = 20;
}
void func()
{
cout << "Son中的func调用" << endl;
}
int m_A;
};
void test01()
{
Son s1;
cout << "s1.m_A = " << s1.m_A << endl;
//我们可以利用作用域 访问父类中的同名成员
cout << "Base中的m_A = " << s1.Base::m_A << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出:
1.2 同名成员函数
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
this->m_A = 10;
}
void func()
{
cout << "Base中的func调用" << endl;
}
void func(int a)
{
cout << "Base中的func(int)调用" << endl;
}
int m_A;
};
class Son :public Base
{
public:
Son()
{
this->m_A = 20;
}
void func()
{
cout << "Son中的func调用" << endl;
}
int m_A;
};
void test02()
{
Son s1;
s1.func();
s1.Base::func(10);
//当子类重新定义了父类中的同名成员函数,子类的成员函数会 隐藏掉父类中所有重载版本的同名成员,可以利用作用域显示指定调用
}
int main(){
test02();
system("pause");
return EXIT_SUCCESS;
}
输出:
二、分析与总结
在 C++ 中,当一个派生类继承自一个基类,并且派生类中定义了与基类相同名称的成员变量或成员函数时,会出现同名成员的情况。在这种情况下,需要注意以下几点:
同名成员变量
:
如果派生类中定义了与基类相同名称的成员变量,派生类的同名成员变量会隐藏基类的同名成员变量。在派生类中访问同名成员变量时,会优先访问派生类中的成员变量。
如果需要访问基类中被隐藏的同名成员变量,可以使用作用域解析运算符::来指定访问基类中的成员变量。
同名成员函数
:
如果派生类中定义了与基类相同名称的成员函数,称为函数重写(override)。在派生类对象上调用同名成员函数时,会调用派生类中的成员函数而不是基类中的成员函数。
如果需要在派生类中调用基类的同名成员函数,可以使用作用域解析运算符::来指定调用基类中的成员函数。