覆盖(重写),重载,隐藏这三者的概念很容易混淆,弄清楚这三者的区别与联系是有必要的.覆盖(重写)->Override,重载->Overload,多态->Polymorphis
- 重载->Overload
函数名字相同
参数不相同(参数个数或参数类型不同)
相同作用域
virtual关键是可有可无
覆盖(重写)->Override
- 函数名字相同
- 参数相同(参数个数和参数类型都必须一致)
- 不同作用域(基类和派生类)
- virtual关键字必须有
- 隐藏:隐藏概念的出现使得三者的关系变得复杂.隐藏概念出现在不同作用域之间
- 如果函数名字相同,但参数不相同(参数个数或参数类型不同).此时,不管函数是否被定义为virtual,基类的函数都将被派生类的同名函数隐藏(区分于函数重载:作用域不相同);
- 如果函数名字相同,参数也相同(参数个数和参数类型都必须一致).此时,函数却没有被定义为virtual,基类的函数都将被派生类的同名函数隐藏(区分于函数覆盖:没有virtual关键字限定).
- 示例代码
class Base{ public: void f(int x){ cout << "Base::f(int) " << x << endl; } void f(float x){ cout << "Base::f(float) " << x << endl; } void h(float x){ cout << "Base::h(float) " << x << endl;} virtual void g(int x){ cout << "Base::g(int)" << x << endl;} }; class Derived : public Base{ public: /*对Base::f(int)的隐藏(注意与覆盖区别)*/ void f(int x){ cout << "Derive::f(int) " << x << endl; } /*对Base::f(float)的隐藏(注意与覆盖区别)*/ void f(float x){ cout << "Derive::f(float) " << x << endl; } /*对Base::h(float)的隐藏(注意与重载区别)*/ void h(int x){ cout << "Derive::h(int) " << x << endl;} /*对Base::g(int)的覆盖*/ virtual void g(int x){ cout << "Derived::g(int)" << x << endl;} };
覆盖,重载,隐藏
最新推荐文章于 2021-02-26 04:39:55 发布