为什么动态演员只能与参考和指针一起使用

Why does dynamic cast only work with references and pointers

本文关键字:指针 一起 参考 动态 为什么      更新时间:2023-10-16

为什么动态铸件仅适用于指针和参考?说我有这样的东西

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);

对象slicedfoo类型的,但仅包含bfoo子对象。这实际上从来都不是您想要的。按值处理多态性类型的实例不是一个不错的选择,另请参阅此线程。

对于反向方向,更明显的是,为什么它不能真正奏效:

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.仅特定于派生类型。在这里,当我们使用指针或参考施放时,它只需切换指针以纠正零件,并且从类型中我们知道它可以移动到访问元素(字段(的多少地址。