a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
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(); }
来源:https://www.cnblogs.com/kuliuheng/p/4107012.html
C++中,分别是:
Overload(重载)
Override(覆盖)
Overwrite(改写)
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
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
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)