派生类对象地址赋给基类指针后, 指针对基类和派生类的函数调用
将 派生类对象地址 赋值给 基类指针 和 派生类指针 后, 同名函数可能会发生 override 和 隐藏 情况.
override: 派生类函数与基类函数同名, 参数也相同, 且基类函数含有 virtual 关键字
隐藏: 指派生类的函数屏蔽了与其同名的基类函数. 规则如下:
- 派生类函数与基类函数同名, 参数不同, 则不论是否有virtual关键字,基类函数会被隐藏;
- 派生类函数与基类函数同名, 参数相同, 没有virtual关键字, 基类函数会被隐藏.
以上摘抄自 << 程序员面试宝典 >>
感觉隐藏还是针对派生类指针来说啊, 被赋值给基类指针的派生类对象地址, 这个指针还是会调用没有被override的基类函数. 指向了派生类对象的基类部分?
#include <iostream> 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 DD; base *pb = ⅅ derived *pd = ⅅ
pb->f(3.14f); pd->f(3.14f); pb->g(2.22f); pd->g(2.22f); pb->g(2); pd->g(2); pb->h(1.21f); pd->h(1.21f); }
运行结果: (在这个页面编写执行的) // 空格是自己加的, 为了好看
Derived::f(float) 3.14 Derived::f(float) 3.14
Base::g(float) 2.22 Derived::g(int) 2
Base::g(float) 2 Derived::g(int) 2
Base::h(float) 1.21 Derived::h(float) 1.21