c++的虚函数如果是private的,该如何实现多态

关于虚函数的回顾:

      1) :虚函数的地址存放于虚函数表之中。运行期多态就是通过虚函数和虚函数表实现的。

      2):类的对象内部会有指向类内部的虚表地址的指针。通过这个指针调用虚函数。

      3):虚函数的调用会被编译器转换为对虚函数表的访问 。

当虚函数是public的,这个时候实现多态的方式:

class Base {
public:
    virtual void f() { 
	cout << "Base::f" << endl; 
    } 
}; 

class Derive : public Base{
public:
    virtual void f() {
	cout<< "derive::f"<<endl;
    }
};

int main()
{
    Derive d;
    Base* b = &d;
    b->f();
    return 0;
}

程序输出:derive::f。这种调用多态的方式的基类的指针动态绑定子类的对象,在调用虚函数的时候会根据实际初始化的对象的虚表指针对访问对应的虚函数表,以此来调用正确的函数。

当虚函数是private的:

当虚函数是private的,虚函数表的机制依然生效,只是对外部来说不能访问这个接口,我们依然可以用访问虚函数表的形式实现多态:


class Base {
private:
    virtual void f() { 
	cout << "Base::f" << endl; 
    } 
}; 

class Derive : public Base{
public:
    virtual void f() {
	cout<< "derive::f"<<endl;
    }
};

typedef void(*Fun)(void);

int main()
{   
    Derive d;
    d.f();
    Base *b = &d;
    Fun pFun = (Fun)*((int*)*(int*)(b)+0);
    pFun();
    return 0;
}

(int*)(b)是访问b的虚函数表地址

(int*)*(int*)(b)+0是虚函数表第一个函数的地址

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值