overrideoverload:函数重载(overload)、函数覆盖(override)



“overload”翻译过来就是:超载过载重载超出标准负荷;“override”翻译过来是:重置覆盖,使原来失去效果

先来说说重载含义在日常生活中我们经常要清洗些东西比如洗车、洗衣服尽管我们说话时候并没有明确地说用洗车方式来洗车或者用洗衣服方式来洗件衣服但是谁也不会用洗衣服方式来洗辆车否则等洗完时车早就散架了我们并不要那么明确地指出来就心知肚明这就有重载意思了在同可访问区内被声名几个具有区别参数列(参数类型、个数、顺序区别)同名会根据区别参数列来确定具体哪个这种机制叫重载重载不关心返回值类型这里“重载”“重”意思区别于“轻重”“重”它是“重复”、“重叠”意思例如在同可访问区内有:
① double calculate(double);
② double calculate(doubledouble);
③ double calculate(double, );
④ double calculate(, double);
⑤ double calculate();
⑥ float calculate(float);
⑦ float calculate(double);
6个同名calculate①②③④⑤⑥中任两个均构成重载⑥和⑦也能构成重载而①和⑦却不能构成重载①和⑦参数相同
覆盖是指派生类中存在重新定义名、参数列、返回值类型必须同父类中相对应被覆盖严格覆盖和被覆盖只有体(花括号中部分)区别当派生类对象子类中该同名时会自动子类中覆盖版本而不是父类中被覆盖版本这种机制就叫做覆盖
下面我们从成员角度来讲述重载和覆盖区别
成员被重载特征有:
1) 相同范围(在同个类中)
2) 名字相同
3) 参数区别
4) virtual关键字可有可无
覆盖特征有:
1) 区别范围(分别位于派生类和基类)
2) 名字相同
3) 参数相同
4) 基类必须有virtual关键字
比如在下面中:

# <iostream>
using std;

Base
{
public:
void f( x){ cout << "Base::f() " << x << endl; }
void f(float x){ cout << "Base::f(float) " << x << endl; }
virtual void g(void){ cout << "Base::g(void)" << endl;}
};

Derived : public Base
{
public:
virtual void g(void){ cout << "Derived::g(void)" << endl;}
};

void (void)
{
Derived d;
Base *pb = &d;
pb->f(42); // 运行结果: Base::f() 42
pb->f(3.14f); // 运行结果: Base::f(float) 3.14
pb->g; // 运行结果: Derived::g(void)
}

Base::f()和Base::f(float)相互重载而Base::g(void)被Derived::g(void)覆盖
隐藏是指派生类屏蔽了和其同名基类规则如下:
1) 如果派生类和基类同名但是参数区别此时不论有无virtual关键字基类将被隐藏(注意别和重载混淆)
2) 如果派生类和基类同名并且参数也相同但是基类没有virtual关键字此时基类被隐藏(注意别和覆盖混淆)
比如在下面中:

# <iostream>
using std;

Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};

Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g( x){ cout << "Derived::g() " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
通过分析可得:
1) Derived::f(float)覆盖了Base::f(float)
2) Derived::g()隐藏了Base::g(float)注意不是重载
3) Derived::h(float)隐藏了Base::h(float)而不是覆盖
看完前面举例可能大家还没明白隐藏和覆盖到底有什么区别我们前面都是讲表面现象怎样实现方式属于什么情况下面我们就要分析覆盖和隐藏在应用中到底有什么区别的处在下面中bp和dp指向同地址按理说运行结果应该是相同可事实并非如此

void (void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;

// Good : behavior depends solely _disibledevent=>

Tags:  函数的重载 函数重载出错 函数重载 overrideoverload

延伸阅读

最新评论

发表评论