dynamic_cast用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dynamic_cast用法相关的知识,希望对你有一定的参考价值。

dynamic_cast用法
语法
dynamic_cast<type-name>(expression)
判断是否可以安全地将对象的地址赋给特定类型的指针。如果可以返回地址否则返回空指针。
可以将有继承关系的派生类对象的地址赋给基类指针。即使基类中没有虚函数也可以使用dynamic_cast。如果将没有继承关系的对象的地址赋给另一个类的指针, 编译器会报错。
请看代码

#include<cstdio>
class Base{
  int dat;
public:
  explicit Base(int val) : dat(val){
    printf("%s, this=%p\n", __func__, this);
  }
#if 0
  virtual void act(){
#else
  void act(){
#endif
    printf("%s, this=%p\n", __func__, this);
  }
};
class Sub : public Base{
public:
  explicit Sub(int val) : Base(val){
    printf("%s, this=%p\n", __func__, this);
  }
};
class Other{
  int dat;
public:
  explicit Other(int val) : dat(val){
    printf("%s, this=%p\n", __func__, this);
  }
};
int main(){
  Base obase(1);
  Sub osub(2);
  Base *pbase = NULL;
  if(pbase = dynamic_cast<Base *>(&osub) ){
    pbase->act();
  }
#if 0
  Other oother(3);
  //error: cannot dynamic_cast & oother (of type class Other*) to type class Base* 
  //(source type is not polymorphic)
  if(pbase = dynamic_cast<Base *>(&oother) ){
    //pobj was not declared in this scope   pobj->act();
    pobj->act();
  }
#endif 
}

测试结果
[email protected]:~/project/test/cpp/rtti$ ./a.out
Base, this=0x7fffe85b2ed0
Base, this=0x7fffe85b2ee0
Sub, this=0x7fffe85b2ee0
act, this=0x7fffe85b2ee0

本文出自 “用C++写诗” 博客,谢绝转载!

以上是关于dynamic_cast用法的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 加载源图像固定用法(代码片段,不全)

c++ 中的 dynamic_cast 有啥替代方法吗?

SQL Select 语句的用法

什么可能导致 dynamic_cast 崩溃?

“dynamic_cast”之后的 NULL 指针实际上可以被取消引用吗?

C++中的dynamic_cast和static_cast