首页 > 试题广场 >

类成员函数的重载、覆盖和隐藏区别描述正确的有?

[不定项选择题]
类成员函数的重载、覆盖和隐藏区别描述正确的有?
  • 覆盖是指在同一个类中名字相同,参数不同
  • 重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字
  • 派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数
  • 函数名字相同,参数相同,基类无virtual关键字的派生类的函数会"隐藏"父类函数
推荐
CD
答案:

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

编辑于 2016-01-11 13:56:58 回复(2)
答案:

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

发表于 2016-10-10 14:06:45 回复(0)
答案CD没有异议,已有的解析也大部分是对的,但有一点需要特别说明:

已有解析提到的“重新定义继承而来的非虚函数,派生类中的函数都会隐藏继承类的同名函数”,这种情况仅限于通过确定对象来调用该函数。
如果通过指针来调用该函数,则实际调用函数将取决于指针的类型(静态绑定),所以这种情况导致了非虚函数的“多态”,这显然是任何编程者都不希望看到的。
发表于 2018-05-31 22:23:06 回复(0)
重载 overload
覆盖 overwrite
发表于 2015-08-08 10:58:19 回复(1)
class People {
public:
	// 隐藏:是指派生类的函数屏蔽基类函数
	// 隐藏规则1:
	// 1) 函数名相同 && 参数不同
	// 2) virtual不影响
	void getId_different_params() {cout << "People::getId_different_params" << endl;}
	virtual void getName_different_params() {cout << "People::getName_different_params" << endl;}

	// 隐藏规则2:
	// 1) 函数名相同 && 参数相同
	// 2) 无virtual
	void getPhone_same_params() {cout << "People::getPhone_same_params" << endl;}

	// 覆盖规则:
	// 1) 函数名相同 && 参数相同
	// 2) 有virtual
	virtual void getAddress_same_params() {cout << "People::getAddress_same_params" << endl;}
};

class Children : public People {
public:
	// 隐藏:是指派生类的函数屏蔽基类函数
	// 隐藏规则1:
	// 1) 函数名相同 && 参数不同
	// 2) virtual不影响
	void getId_different_params(int) {cout << "Children::getId_different_params(int)" << endl;}
	virtual void getName_different_params(int) {cout << "Children::getName_different_params(int)" << endl;}

	// 隐藏规则2:
	// 1) 函数名相同 && 参数相同
	// 2) 无virtual
	void getPhone_same_params() {cout << "Children::getPhone_same_params" << endl;}

	// 覆盖规则:
	// 1) 函数名相同 && 参数相同
	// 2) 有virtual
	virtual void getAddress_same_params() {cout << "Children::getAddress_same_params" << endl;}
};

void test1()
{
	/*
	Children::getId_different_params(int)
	Children::getName_different_params(int)
	Children::getPhone_same_params
	Children::getAddress_same_params
	*/
	Children *c = new Children();
	c->getId_different_params(1);
	c->getName_different_params(1);
	c->getPhone_same_params();
	c->getAddress_same_params();

	
	/*
	People::getId_different_params
	People::getName_different_params
	People::getPhone_same_params
	Children::getAddress_same_params		// not override
	*/
	People *p = new Children();
	p->getId_different_params();
	p->getName_different_params();
	p->getPhone_same_params();
	p->getAddress_same_params();
}

发表于 2016-01-06 22:28:03 回复(3)
隐藏基类成员函数的情况:如果在派生类中定义了一个与基类同名的函数,不管这个函数的参数列表是不是与基类中的函数相同,则这个同名的函数就会把基类中所有这个同名的函数的所有重载版本都隐藏了
发表于 2020-05-27 22:45:18 回复(0)

来源:https://www.cnblogs.com/kuliuheng/p/4107012.html

C++中,分别是:

 Overload(重载)

 Override(覆盖)

Overwrite(改写)

来看个图:

编辑于 2020-04-28 11:03:52 回复(0)
答案:

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

发表于 2018-08-01 10:45:41 回复(0)
class Super {
public:  
    void go() { cout << "go() called on Super" << endl; }
};

class Sub : public Super {
public:  
    void go() { cout << "go() called on Sub" << endl; }
};

int main()
{
    Sub mySub;  
    Super& ref = mySub; 
    ref.go(); 
    return 0;
}

由于Super类中go() 方法不是虚的,因此派生类中的go()方法隐藏了基类中的go()方法,
故实际输出的是:
go() called on Super

编辑于 2017-12-17 22:34:09 回复(0)
派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数//参数不同也会隐藏,这点和java有点不同
函数名字相同,参数相同,基类无virtual关键字的派生类的函数会"隐藏"父类函数
发表于 2016-11-15 15:29:16 回复(0)
注重C选项正确,即使参数不同也不可以
发表于 2016-09-22 13:02:43 回复(0)