为什么动态转换只适用于引用和指针

Raj*_*war 5 c++ casting

为什么动态转换仅适用于指针和引用?说我有这样的东西

struct foo
{
    virtual void test(){}
};
struct bar : public foo
{
};
Run Code Online (Sandbox Code Playgroud)

为什么这样的东西不起作用

foo* f = new bar();
bar& b = dynamic_cast<bar>(*f); //Fail must be either pointer or reference
Run Code Online (Sandbox Code Playgroud)

现在假设bar它的父级 foo 确实有一个转换构造函数。我的问题是为什么动态转换只接受指针和引用而不是像这样的简单对象static_cast

lub*_*bgr 4

dynamic_cast只有一个目的:沿继承层次结构进行转换,特别是向上和向下转换。让我们假设它适用于您的示例中的值,这里会发生什么:

bar b{};

auto sliced = dynamic_cast<foo>(b);
Run Code Online (Sandbox Code Playgroud)

该对象sliced属于 类型foo,但仅包含foo的子对象b。这实际上绝不是您想要的。按值处理多态类型的实例不是一个好的选择,另请参阅此线程

对于相反的方向,更明显的是为什么这不能很好地工作:

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);
Run Code Online (Sandbox Code Playgroud)

最后一个示例中的注释有点夸张,因为它dynamic_cast是一个运算符而不是一个函数,但它应该指出这里的问题:跨层次结构的转换不能很好地处理值语义,并dynamic_cast反映了这一点。

  • 向上、向下以及**跨**层次结构。`struct c : a, b {};`(假设`a`和`b`都有虚函数),`a* pa = new c; b* pb =dynamic_cast&lt;b*&gt;(ap):`。但这是一个小问题。+1。 (2认同)