c++重载、覆盖和隐藏
c++成员函数的重载、覆盖和隐藏很容易混淆,因此我们必须搞清楚这一点。
1.重载
重载特点:同一访问区域(同类)、函数名称相同、函数参数不同(不关心返回类型)、virtual关键字可有可无。
代码示例:
class OverLoad { public: void test() {} void test(int i) {} void test(float i) {} void test(int i, float j) {} };
2.覆盖
覆盖是指派生类函数覆盖基类函数,特点是:不同访问区域(不同类)、函数名称相同 、参数相同、基类函数必须有virtual关键字。
3.隐藏
隐藏规则:
1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
4.代码示例
#include <iostream> using namespace std; class OverLoad { public: void test() {} void test(int i) {} void test(float i) {} void test(int i, float j) {} }; class Base { public: virtual void A(int i) { cout << "Base::A()" << endl; } void B(int i) { cout << "Base::B()" << endl; } void C(int i) { cout << "Base::C()" << endl; } void D() { cout << "Base::D()" << endl; } }; class Derive : public Base { public: //覆盖父类的A 函数名、参数完全相同,且父类要有virtual,子类virtual可有可无 virtual void A(int i) { cout << "Derive::A()" << endl; } //隐藏父类中的B 函数名、参数完全相同,父类无virtual void B(int i) { cout << "Derive::B()" << endl; } //隐藏父类中的C 函数名相同、参数不同,与virtual无关 void C(char* str) { cout << "Derive::C()" << endl; } }; int main() { Derive* d = new Derive; Base* b = d; //均调用父类中的A d->A(1); b->A(2); //分别调用自己的B d->B(1); b->B(1); //分别调用自己的C d->C("1"); b->C(1); d->D();//未被隐藏可以调用D() //d->C(1);由于隐藏了父类中的void C(int i),所以不能再调用 }