使用`static_cast`进行向下转换空指针(单个或多个继承)

时间:2016-12-12 19:40:20

标签: c++ pointers polymorphism downcast

正如标题所说,如果我将一个指向基类的指针转换为派生类,当指针为空时,从C ++ 11 / C ++的角度来看它是否是一个安全的操作14标准?

struct base
{
   virtual ~base() = default;
};

struct derived : base {};

struct wrapper
{
   using allowed_derived_t = derived;
   base* base_ptr = nullptr;

   void set_ptr(base* ptr)
   {
       if (!dynamic_cast<allowed_derived_t*>(ptr))
          throw std::logic_error("Check your user code");

      base_ptr = ptr;
   }

   allowed_derived_t* ptr() const
   { return static_cast<allowed_derived_t*>(base_ptr); }
};

如果我在调用ptr()之前调用它,那么set_ptr方法是否安全?因为,在设置指针之前,base_ptr不是所需类型(allowed_derived_t),但是,动态指向对象不是错误的类型(因为没有指向的)对象)。

标准在那种情况下说了什么?

2 个答案:

答案 0 :(得分:6)

所有结构良好的指针到指针的转换都保证源类型的空指针安全地转换为目标类型的空指针。

对于dynamic_cast,请在

中说明
  

5.2.7动态广告

     

4 如果v的值是指针大小写中的空指针值,则结果是类型为T的空指针值。

对于static_cast,请在

中说明
  

5.2.9静态投射

     

11 [...]空指针值(4.10)将转换为目标类型的空指针值。

所有其他演员都提供类似的保证。

答案 1 :(得分:1)

static_cast检查转换在编译时是否有效,因此转换指针的运行时值不起任何作用。

这样安全,nullptr会在运行时产生nullptr

对于任何其他类型的演员来说都是如此。