类继承——成员函数继承的规则探究

上一篇博客中探究了类中虚函数派生时的一些规则,本文旨在:成员函数继承时的作用域与规则

现附上代码块如下:

class Sports
{
public:
	virtual void tennis(void) { cout << "Sports::tennis" << endl; }
	virtual void basketball(void) { cout << "Sports::basketball" << endl; }
	void football(void) { cout << "Sports::football" << endl; }    --------------------------- 1
};

class BallGames:public Sports
{
public:
	virtual void tennis(int a) { cout << "BallGames::tennis" << endl; }
	void football(void) { cout << "BallGames::football::void" << endl; }  -------------------- 2
	void football(int a) { cout << "BallGames::football::int" << endl; }  -------------------- 3
};1
};

class BallGames:public Sports
{
public:
	virtual void tennis(int a) { cout << "BallGames::tennis" << endl; }
	void football(void) { cout << "BallGames::football::void" << endl; }  -------------------- 2
	void football(int a) { cout << "BallGames::football::int" << endl; }  -------------------- 3
};

采用下示代码进行调试:

	Sports Lee;
	cout << "基类对象访问的函数:" << endl;
	Lee.tennis();
	Lee.football();
	BallGames Zhang;
	cout << "子类对象访问的函数:" << endl;
	Zhang.tennis(1);
	Zhang.football();     ----------------- 4
	Zhang.football(1);    ----------------- 54
	Zhang.football(1);    ----------------- 5

类继承——成员函数继承的规则探究_第1张图片

根据上述结果,当父类访问函数时,显然,其作用域只有其本身的函数;当子类访问同名函数时,若子类中对该函数进行了重载,则访问的为子类中对应的函数;

1. 若注释掉 2 ,则此时于 BallGames 中对 football(void) 的访问变得非法,因为拥有空参数的该函数定义未存在!表明:当子类中出现父类的同名非虚函数时,父类中的同名函数的将被隐藏,变得无法访问。此时便由于无法访问父类中的 football(void) 导致出错。

2. 若注释掉 2 3 5,此时子类BallGames中对于football(void)又将变得合法。表明:父类的普通成员函数将被子类继承,子类能直接访问父类的成员函数。

总结:类继承时,普通成员函数的访问由对象的作用域决定,同时遵循默认的隐藏规则,父类对象的作用域为全局(所有父类对象以及子类对象),若是子类出现相同定义,则位于内部的子类成员函数将遮盖掉父类成员函数的访问。

tips:若类中出现重载的函数 func ,此时子类也对 func 进行了 重载,此时,一旦 子类中出现了重载,父类中所有的该函数接口均被遮盖,从而变得无法访问!

你可能感兴趣的:(virtual_func,c语言)