为什么动态演员只能与参考和指针一起使用
Why does dynamic cast only work with references and pointers
为什么动态铸件仅适用于指针和参考?说我有这样的东西
struct foo
{
virtual void test(){}
};
struct bar : public foo
{
};
为什么不这样的工作
foo* f = new bar();
bar& b = dynamic_cast<bar>(*f); //Fail must be either pointer or reference
现在假设bar
确实具有其父foo的转换约束。我的问题是,动态铸件为什么只摄取指针和参考,而不是像static_cast
这样的简单对象?
dynamic_cast
只有一个目的:沿继承层次结构施放,特别是层次结构和层次结构。让我们假设它适用于示例中的值,这里会发生什么:
bar b{};
auto sliced = dynamic_cast<foo>(b);
对象sliced
是foo
类型的,但仅包含b
的foo
子对象。这实际上从来都不是您想要的。按值处理多态性类型的实例不是一个不错的选择,另请参阅此线程。
对于反向方向,更明显的是,为什么它不能真正奏效:
bar b{};
foo& f = b;
// Pass f by value to dynamic_cast?! Then, the argument is already
// sliced before the dynamic_cast is even able to determine its
// runtime type.
bar downcast = dynamic_cast<bar>(f);
上一个示例中的评论有点夸张,因为dynamic_cast
是操作员而不是函数,但是它应该在此处查明问题:跨层次结构的转换对价值语义不太好,而dynamic_cast
反映了这一点。
动态铸件在两个类别B和派生的D级之间有关系(继承(。如果我们使用非参考和指针类型,则意味着我们正在转换它们,那么我们需要转换操作员,例如。操作员B((或操作员B((并返回您想要的内容。
这里的情况是不同的:我们有一个具有两个部分的对象。基本类型2.仅特定于派生类型。在这里,当我们使用指针或参考施放时,它只需切换指针以纠正零件,并且从类型中我们知道它可以移动到访问元素(字段(的多少地址。
相关文章:
- 在将 new 与指针一起使用时,创建数组的指定长度
- 为什么我们将 [ ] 与指向数组的指针一起使用?
- 如何将数组与指针一起使用?
- 如何将 string.erase() 与指针一起使用?
- __unaligned说明符何时与指针一起使用?
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 自动关键字与智能指针一起
- shared_ptr ::重置仅与原始指针一起使用
- 为什么动态演员只能与参考和指针一起使用
- 是否可以将SDL2与智能指针一起使用
- 如何将此指针与指向成员函数的指针一起使用
- 将shared_ptr与指向指针的指针一起使用时出现编译器错误
- 将 std::sort 与指向整数变量的指针一起使用会产生意外的输出
- QtConcurrent::run 是否可以与指向对象的智能指针一起使用
- 重新分配指针后,将类功能与指针一起使用
- 将共享指针的别名构造函数与空共享指针一起使用C++
- 如何将转换构造函数与指针一起使用?
- 如何 RAII 与指针一起使用
- Vtables是否仅与指向基类的指针一起使用
- 将 decltype 与虚拟成员函数指针一起使用