父类子类指针相互转换

父类子类指针相互转换
1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:

2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;

3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;

当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;
当父类子类有同名虚函数的时候,调用的是指针转换前指向的对象类型的函数。

class A
{
public:
    virtual void foo(){std::cout<<"A"<<std::endl;}
            void nfoo(){std::cout<<"non virtual A"<<std::endl;}
};


class B :public A
{
public:
    virtual void foo(){std::cout<<"B"<<std::endl;}
            void nfoo(){std::cout<<"non virtual B"<<std::endl;}

};

int main()
{
    A *pa=new A;
    B *pb=(B*)pa;
    pb->foo();
    pb->nfoo();

    B *ppb=new B;
    A *ppa=(A*) ppb;

    ppa->foo();
    ppa->nfoo();
    return 0;
}

output
A
non virtual B
B
non virtual A
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值