使用“ static_cast”在空指针(单个或多个继承)上进行降低
use `static_cast` for downcasting over a null pointer (single or multiple inheritance)
正如标题所说,如果我将指针指向基类的指针,当指针为null时,从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); }
};
如果我在调用set_ptr
之前调用ptr()
方法是安全的吗?因为,在设置指针之前,base_ptr
不是必需的类型(allowed_derived_t
),但是,动态指向对象不是错误的类型(因为没有指向对象)。
标准在这种情况下怎么说?
所有形式良好的指针到点铸件保证,源类型的空指针安全地转换为目标类型的null指针。
对于dynamic_cast
,它在
5.2.7动态铸造
4 如果V的值是指针案例中的空指针值,则结果是类型t。
的零指针值
对于static_cast
,它在
5.2.9静态铸造
11 [...] NULL指针值(4.10)转换为目标类型的空指针值。
所有其他演员都提供了类似的保证。
static_cast
检查转换在编译时是否有效,因此铸造指针的运行时值不起作用。
因此,这很安全,nullptr
将在运行时产生nullptr
。
对任何其他类型的演员都如此。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 使用类继承将单个喜欢的列表转换为双向链表
- 使用“ static_cast”在空指针(单个或多个继承)上进行降低
- C 数据结构代表单个继承
- 我是否应该期望单个继承中的向上转换和向下转换不会调整指针?
- 每个层次结构的单个单一实例继承