本文共 1982 字,大约阅读时间需要 6 分钟。
重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。
重写/覆盖是在在派生类中重新对基类中的虚函数重新实现;即函数名和参数都一样,只是函数的实现体不一样。
关于隐藏,参见: Effective C++:条款33:避免遮掩继承而来的名称
隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉;
#include#include using namespace std;class 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; } }; class Derived : public Base { public: virtual void f(float x){ cout << "Derived::f(float) " << x << endl; } void g(int x) { cout << "Derived::g(int) " << x << endl; } void h(float x){ cout << "Derived::h(float) " << x << endl; } };int main() { Derived d; Base *pb = &d; Derived *pd = &d; // Good : behavior depends solely on type of the object pb->f(3.14f); // Derived::f(float) 3.14 pd->f(3.14f); // Derived::f(float) 3.14 // Bad : behavior depends on type of the pointer pb->g(3.14f); // Base::g(float) 3.14 pd->g(3.14f); // Derived::g(int) 3 (surprise!) // Bad : behavior depends on type of the pointer pb->h(3.14f); // Base::h(float) 3.14 (surprise!) pd->h(3.14f); // Derived::h(float) 3.14 return 0;}
在第一种调用中,函数的行为取决于指针所指向的对象;在第二第三中调用中,函数的行为取决于指针的类型。所以说,隐藏破坏了多态。
隐藏实例:
#includeVS: error C2660: 'Derived::f' : function does not take 1 arguments#include using namespace std;class Base { public: void f(float x){ } }; class Derived : public Base { public: void f(float x, float y){ } void test() { f(1.0f); } };int main() { return 0;}
在派生类的域中,基类中的函数被隐藏。