C++同名成员处理详解

1.知识总结

1.派生类对象可以直接访问到派生类中同名成员。

2.派生类对象加作用域可以访问到基类同名成员。

3.当派生类与基类拥有同名成员函数,派生类会屏蔽基类中同名成员函数,通过加作用域可以访问到基类的同名成员函数。

2.代码详解

1.同名成员变量处理

基类和派生类分别如下:

class Base {//基类
public:
	Base()
	{
		m_A = 10;//给基类成员m_A赋值为10
	}
	void fun()
	{
		cout << "Base-fun" << endl;
	}
	void fun(int A)
	{
		cout << "Base-fun(A)" << endl;
	}
	int m_A;
};
class Son :public Base	//public方式继承基类
{
public:
	Son()
	{
		m_A = 20;//与基类的成员名称相同
	}
	int m_A;

	void fun()//同名成员函数
	{
		cout << "Son-fun" << endl;
	}

从上图可以看出派生类中构造函数中 m_A=20,而基类构造函数中 m_A=10

现在增加一个测试案例test01:

//测试案例一
void test01()
{
	Son s1;
	//直接访问派生类成员
	cout << "m_A: " << s1.m_A << endl;
	
	//加作用域可访问基类成员
	cout << "m_A: " << s1.Base::m_A << endl;
}
int main()
{
    test01();
    return 0;
}

运行结果如下

 从图中可得知当派生类对象直接访问时,访问的是派生类的m_A,通过加作用域的方式可以访问到基类的m_A。

2.同名成员函数处理

基类和派生类的代码段中均含有fun()函数,那么派生类对象对它们的访问方式是怎样的呢?事实上,派生类对象对同名函数的访问方式与上面所讲的同名变量访问方式相同,都是通过加作用域的方式才能访问到基类成员。

增加一个测试案例test02

void test02()
{
	Son s1;
	s1.fun();	//直接访问为派生类的同名成员函数
	s1.Base::fun();	//同理需要加作用域才可访问基类的同名成员函数
}
int main()
{
    test02();
    return 0;
}

 运行结果如下:

 结果显而易见了。

对于同名函数还有一种情况:基类中的同名函数发生重载会怎样?

观察基类的代码段,发现其中有 fun() 的重载函数 fun(int),而派生类中没有,那么我们是否能直接访问fun(int)呢? 答案是:不能!

 测试之后发现如果直接调用会出现“函数调用中参数太多的”错误,说明派生类中直接无法识别到fun(int)的存在,事实上,当派生类与基类拥有同名成员函数,派生类会屏蔽基类中同名成员函数,对于基类中的函数重载也不例外。这时,我们通过加作用域的方式就能完美解决了。

void test03()
{
	Son s1;
	s1.Base::fun(0);
}

总结:

派生类对象可以直接访问派生类同名成员,通过加作用域访问基类同名成员。

猜你喜欢

转载自blog.csdn.net/m0_52910424/article/details/121442560