派生类对象地址赋给基类指针后, 指针对基类和派生类的函数调用

将 派生类对象地址 赋值给 基类指针派生类指针 后, 同名函数可能会发生 override隐藏 情况.

override: 派生类函数与基类函数同名, 参数也相同, 且基类函数含有 virtual 关键字

隐藏: 指派生类的函数屏蔽了与其同名的基类函数. 规则如下:

  1. 派生类函数与基类函数同名, 参数不同, 则不论是否有virtual关键字,基类函数会被隐藏;
  2. 派生类函数与基类函数同名, 参数相同, 没有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 = &DD;
    derived *pd = &DD;
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

 

 

 

转载于:https://www.cnblogs.com/heifengli/p/10974267.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值