函数调用时的临时对象_C++|一个简单实例和一张图深刻认识虚函数与运行时多态...

首先了解一下实现运行时多态的前提条件:

赋值兼容是动多态能够产生的前提。所谓赋值兼容顾名思义:不同类型的变量之间互相赋值的兼容现象。就像隐式类型转换一样,而对于父子类对象之间的赋值兼容是有严格规定的,只有在以下几种情况下才能赋值兼容:

① 派生类的对象可以赋值给基类对象。

② 派生类的对象可以初始化基类的引用。

③ 派生类对象的地址可以赋给指向基类的指针

但是由于基类对象与基类引用的局限性,我们一般采用基类指针进行派生类对象的函数调用。

实现条件:

① 父类中有虚函数。

② 子类 override(覆写/覆盖)父类中的虚函数。

③ 通过己被子类对象赋值的父类指针或引用,调用共用接口。

简单小实例:

#include using namespace std;class A {public:A() : m_data1(0), m_data2(0) {}virtual void vfunc1() { cout << "A::vfunc1" << endl; }; virtual void vfunc2() { cout << "A::vfunc2" << endl; }; void func1() { cout << "A::func1" << endl; }; void func2() { cout << "A::func2" << endl; };private: int m_data1, m_data2;};class B : public A {public:B() : A(), m_data3(0) {} virtual void vfunc1() { cout << "B::vfunc1" << endl; }; void func1() { cout << "B::func1" << endl; };private: int m_data3;};class C: public B {public:C() : B(), m_data1(0), m_data4(0) {} virtual void vfunc2() { cout << "C::vfunc2" << endl; }; void func2() { cout << "C::func2" << endl; };private: int m_data1, m_data4;};int main(){ A *p;A aObject;p = &aObject;p->vfunc1();B bObject;p = &bObject;p->vfunc1();C cObject;p = &cObject;p->vfunc1();p->vfunc2();cObject.A::func1();aObject = static_cast(bObject);//在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;//在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。aObject.vfunc1();/*B* bp = &bObject;C* cp = &cObject;cp = static_cast(bp);//在类层次间进行上行转换(指针)时,dynamic_cast和static_cast的效果是一样的;//在进行下行转换(指针)时,dynamic_cast具有类型检查的功能,比static_cast更安全。cp->vfunc1(); //B::vfunc1dynamic_cast(bp);cp->vfunc1(); //B::vfunc1*/system("pause");return 0;}/*A::vfunc1B::vfunc1B::vfunc1C::vfunc2A::func1A::vfunc1*/

图解:

bb7469545351e96644b75324b8bfcef5.png

-End-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值