dynamic_cast的一些疑问

本文探讨了dynamic_cast在处理多态类型转换时的注意事项。当父类指针指向子类对象并调用虚函数时,dynamic_cast能够正确运行。但如果指针为空或者误用,可能会导致运行时错误。动态转换非虚函数可能不会立即引发问题,但涉及虚函数时,由于需要查找虚函数表,空指针操作将导致程序崩溃。
  #define _CRT_SECURE_NO_WARNINGS
   #include<iostream>
   using namespace std;

   class CAnimal
   {
   public:
       virtual void Func() {}
   };
   class CCat :public CAnimal
   {
   public:
       virtual void Func() {}
       void Ftt() {}
   };

   void test()
   {
       CAnimal *a = new CAnimal;
       CCat *c = dynamic_cast<CCat*>(a);
       a->Ftt();
   }

   void main()
   {

       test();

       system("pause");
       return EXIT_SUCCESS;
   }

这里编译器认为你是多态:即父类指针指向子类对象,并且子类重写父类的virtual方法
这里是父类指针指向父类对象,再下行。
dynamic_cast认为你写的是父类指针指向子类对象,所以不会报错。
但是运行的时候会炸。

void test01()
{
    A *a1 = new A;
    B *b1 = dynamic_cast<B*>(a1);

    A *a2 = new B;
    B* b2 = dynamic_cast<B*>(a2);

    cout << b1 << endl;
    cout << b2 << endl;   

}

这里 b1 = 0;
炸的原因是操作空指针。这里需要说明的是,如果访问非虚函数不一定会炸,因为类对象的成员变量和成员函数是分开的,取非虚函数只需要在非虚函数的形参里加this指针,如果非虚函数里不操作不会炸。
但是虚函数要根据ptr去找虚函数表,这样是必须操作类对象的地址的。

((void(*)())(*(long *)*(long *)&b1))();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值