引用/对象的静态/动态强制转换
static/dynamic cast of references/objects
前一段时间,我和一群选角操作符一起玩,显然当时我并没有真正理解。我现在正在查看我的代码,我看到了这个:
Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){}
我想我现在对指针和引用的投射有了更好的理解,这要归功于stackoverflow上的一个非常好的答案,但现在涉及到了对象。当引用被投射到对象时,会发生什么?或者,如果p_derived是对象本身而不仅仅是一个引用呢?它会创建新的对象吗?如果是,这些对象将如何安装?
我也很惊讶,因为在这个代码所在的Base.h中,Derived只是前向声明的,这意味着它不应该知道它实际上是从Base派生的。我在另一个地方尝试了从Derived*到Base*的静态转换,但这将理所当然地不会编译,因为就翻译单元而言,类型是不兼容的。
当你使用引用时,你通常实际上是在使用它所引用的对象。这就是引用语法的神奇透明度,而指针是无法做到的;可以说这就是他们存在的原因。
这种情况也不例外:您将p_derived
裁判,并通过切片从中构建一个新的Base
。
static_cast<Base&>(p_derived)
将强制转换引用本身,如果这是您想要的(即使不是:p)。
我也很惊讶,因为在这个代码所在的Base.h中,Derived只是前向声明的,这意味着它不应该知道它实际上是从Base派生的。
是的,这也让我很惊讶。你确定吗?(Demo/Demo-不确定您使用的是哪一个)
相关文章:
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 重构使用动态强制转换的 std::set 的比较运算符
- 指针类型类成员的动态强制转换的恒定性是什么?
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++动态将矢量转换为 2D
- 为了访问方法,从基类动态转换为派生类
- 如何对以下程序使用静态或动态转换
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 函数返回动态强制转换的指针,返回指针,就好像它根本没有被转换一样
- 使用静态转换,因为动态转换失败.不好的做法?
- 动态强制转换的运行时检查
- 在 c++ 中动态强制转换 ** 数组
- C++:使用重载而不是动态强制转换通过基选择派生类
- 使用动态强制转换的 Lambda
- 用于验证类型的动态强制转换
- 动态强制转换指向引用的指针和指向指针的引用
- 需要派生类的动态强制转换:寻找替代方法
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- 动态强制转换 (dynamic_cast) 在 OSx (XCode ) 上使用 .dylib 时失败