菜鸟笔记
提升您的技术认知

dynamic-ag真人游戏

dynamic 转换时的类必须有虚函数,否则会编译报错。

#include 
using namespace std;
class a
{
public:
    int a ;
    int b;
    void prt(void){std::cout <<"prt here" << std::endl;}
    //virtual ~a(){};
};
class b: public a
{
};
class c: public a
{
};
int main()
{
    a *pa = new b;
    a& ra = *pa;
    b *pb = dynamic_cast (pa);
    cout <<"1\n";
    cout < (ra);
    cout <<"2";
    fflush(stdout);
}

编译报错:

> g   main.cpp
main.cpp: in function 'int main()':
main.cpp:26: error: cannot dynamic_cast 'pa' (of type 'class a*') to type 'class b*' (source type is not polymorphic)
main.cpp:27: error: cannot dynamic_cast '(a&)((a*)ra)' (of type 'class a&') to type 'class c&' (source type is not polymorphic)
> fg

加上虚析构函数后,编译通过,运行结果,

suspended
> ./a.out 
1
0x28301030
terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
abort (core dumped)

可见在第二个dynamic_cast 时抛出异常,原因是b类型无法转换成c类型。   作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 

       即会作一定的判断。 

       对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 

       对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。 

  

注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数。例如在下面的代码中将cbasic类中的test函数不定义成 

       virtual时,编译器会报错:error c2683: dynamic_cast : “cbasic”不是多态类型 

    

网站地图