C++ 之dynamic_cast

dynamic_cast 与 一般强制类型转换的却别:①dynamic_cast只能对指针或引用强制转换;②dynamic_cast会进行安全检查。

对于强制类型转换我个人的理解是,强制类型转换只是改变了内存的操作范围,因为对象写入内存中后,要进行强制类型转换时并没有对对象的内存进行重写操作。只是改变了对这块内存的操作范围,比如 int a =1; char b=(int) a; 对a这个4byte的内存空间,b只操作a的最高位1byte。

在多重继承中:

class A{public: virtual void f1();};

class B{public: virtual fvoid 2();}

class C:public A,public B{ public: virtual void f1(); virtual void f2()}; 

C c; // c中内存分配为  ||||||||-----A虚表指针--A数据成员--B虚表指针--B数据成员--C数据成员------|||||

A *pa=dynamic_cast<A*> c;  将pa指向c中A的虚表指针,

B*pb=dynamic_cast<B*> c; 将pb指向c中B的虚表指针; dynamic_cast 如果转换不成功会返回NULL指针。

--------------------------------------------

父类指针指向子类对象时,当调用虚函数的时候,父类指针指向的其实还是子类对象的内存,只不过这段内存正好是完全继承自父类的!!所以调用非虚函数调用的是父类的。而调用虚函数时 ,虚表指针指向子类的虚表,但是此时子类虚表中已将父类的虚函数覆盖了,所以调用的是子类的虚函数。这就实现了 父类指针指向子类对象仍旧可以调用子类虚函数!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值