首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用`static_cast`通过空指针进行向下转换(单继承或多继承)

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

Stack Overflow用户
提问于 2016-12-12 19:40:20
回答 2查看 581关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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),所以动态指向的对象不是错误的类型(因为没有指向的对象)。

在这种情况下,标准是怎么说的?

EN

回答 2

Stack Overflow用户

发布于 2016-12-12 19:44:18

所有格式良好的指针到指针的强制转换都保证了源类型的空指针可以安全地转换为目标类型的空指针。

对于dynamic_cast,它在

5.2.7动态转换

4如果在指针情况下v的值是空指针值,则结果是T类型的空指针值。

对于static_cast,它在

5.2.9静态转换

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

所有其他强制转换都提供了类似的保证。

票数 6
EN

Stack Overflow用户

发布于 2016-12-12 19:45:25

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

所以这是安全的,nullptr会在运行时产生nullptr

对于任何其他类型的演员来说,这都是真的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41108304

复制
相关文章
【Python】面向对象 - 继承 ① ( 继承概念 | 继承语法 | 单继承与多继承 | 代码示例 )
继承 属性 和 方法 的类被称为 " 子类 " , 被 继承 的类 称为 " 父类 " 或 " 基类 " ;
韩曙亮
2023/10/11
1710
【Python】面向对象 - 继承 ① ( 继承概念 | 继承语法 | 单继承与多继承 | 代码示例 )
python之类的单继承与多继承
  Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。下面我们来介绍一下python的类的单继承与多继承。
jiankang666
2022/12/05
4940
python之类的单继承与多继承
Java中为什么要使用单继承而不是多继承?
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。
Vincent-yuan
2021/10/13
1.7K0
C++继承(多继承、菱形继承?)
继承(inheritance)机制是面向对象程序设计,使代码可以复用的最重要的手段。它允许程序员在保持原有类特性的基础上进行扩展,以增加功能。这样产生新的类,称为派生类。
利刃大大
2023/04/12
2K0
C++继承(多继承、菱形继承?)
PHP通过_call实现多继承
_call:php的一个魔术方法,当调用类中不存在的method时,会自动调用_call.
猿哥
2019/03/22
8740
【C++】继承 ① ( 面向对象特点 | 类之间的关系 | 单继承与多继承 | 继承关系特性 )
本篇博客开始 讲解 IS-A 类关系 中的 继承关系 ( 泛化关系 Generalization ) ;
韩曙亮
2023/10/15
2210
多继承 , 组合 , 菱形继承 , 接口
一, 复习 属性的的正确存放位置: 类中应该存储所有对象公共的内容 对象中存储都是每个对象独有的(都不同) 初始化函数: 给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性 节省了重复代码 绑定方法: 指的是 将类或对象与函数进行了绑定 之所以绑定是为了提高整合度,后续在拿到对象就可以直接调用而无需关心 数据是什么 如何处理 对象也可以看做是一个存储数据的容器 对象绑定方法: 默认情况下就是绑定给对象的
py3study
2020/01/15
7190
一个interface可以继承多个interface_java语言支持单继承和多继承
搞Java也有两个年头多了 ,今天在修改程序时无意中发现,Java接口中继承了多个接口,哎,真是惭愧直到现在才搞明白。
全栈程序员站长
2022/11/01
4940
JavaScript或ES6如何实现多继承总结【Mixin混合继承模式】
总结一句话:所谓的多继承或Mixin混合模式继承就是让继承的类成为一个变量即可【可以根据不同的需求继承不同的类】
kirin
2020/09/18
3.9K0
Python中类的继承、多层继承和多继承
继承的语法为在类名后的小括号()中写入要继承的父类名,如果要继承多个类则中间用逗号分隔。
Python碎片公众号
2021/02/26
5.5K0
Python中类的继承、多层继承和多继承
C++继承中的多继承语法与菱形继承
vbptr全称:virtual base pointer虚基类指针,指向vbtable ,virtual base table 虚基类列表。
CtrlX
2022/09/23
7310
C++单继承、多继承情况下的虚函数表分析
C++的三大特性之一的多态是基于虚函数实现的,而大部分编译器是采用虚函数表来实现虚函数,虚函数表(VTAB)存在于可执行文件的只读数据段中,指向VTAB的虚表指针(VPTR)是包含在类的每一个实例当中。当使用引用或指针调用虚函数时,首先通过VPTR找到VTAB,然后通过偏移量找到虚函数地址并调用。
jianghaibobo
2019/08/02
2.8K0
Python多继承与super使用详解
如果不同的父类中存在 同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?
用户7886150
2021/01/20
2.8K0
python 实现多继承
python是少数支持多重继承的现代编程语言之一。多重继承是同时从多个基类派生一个类的能力
公众号---人生代码
2020/05/18
6660
Python面向对象编程-三大特性-继承-单继承
单继承是指一个子类只继承一个父类的属性和方法。在 Python 中,默认情况下,所有的类都直接或间接继承自 object 类。下面是一个简单继承的例子:
玖叁叁
2023/04/18
3800
多继承三角和钻石问题(虚继承)
上一篇文章我们简单介绍了一下多继承的语法,但是我们遇到了一个问题,那就是如果多个父类具有相同名称的成员变量或成员方法,子类在调用的时候就会出现二义性问题,子类不知道选择哪一个父类的变量或方法,我们称之为三角问题。如下所示:
我与梦想有个约会
2023/10/20
1710
多继承三角和钻石问题(虚继承)
Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
FatherA.__init__(self) # 在子类中调用父类的方法:父类名.方法名称(参数)
授客
2019/09/11
3.2K0
Python面向对象编程-三大特性-继承-多继承
多继承是指一个子类继承多个父类的属性和方法。在 Python 中,我们可以在类定义时指定多个父类,用逗号分隔即可。下面是一个简单的例子,演示了如何使用多继承:
玖叁叁
2023/04/18
4310
Java 不支持多继承,通过实现Runnable接口
注意上面的代码中不可以runnable.start(),因为Runnable接口中的唯一方法就是run方法。Thread.java构造函数支持传人一个Runnable接口的对象。由于Thread 实现 Runnable 接口,构造函数Thread(Runnable target)不光可以传人Runnable接口的对象,还可以传入一个Thread类的对象,这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用。
用户7365393
2021/10/08
6130
点击加载更多

相似问题

关于指针向下转换/继承

22

c#继承和向下转换继承层次

30

如何使用单例进行继承

42

单继承类的指针转换偏移量

21

继承中的向下转换

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文