Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么动态强制转换只与引用和指针一起工作_C++_Casting - Fatal编程技术网

C++ 为什么动态强制转换只与引用和指针一起工作

C++ 为什么动态强制转换只与引用和指针一起工作,c++,casting,C++,Casting,为什么动态强制转换只适用于指针和引用? 假设我有这样的东西 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 foo*f=newbar(); 棒材和棒材=动态铸件(*f)

为什么动态强制转换只适用于指针和引用? 假设我有这样的东西

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
foo*f=newbar();
棒材和棒材=动态铸件(*f)//失败必须是指针或引用
现在假设
bar
确实有一个用于其父foo的转换构造函数。
我的问题是,为什么动态强制转换只接受指针和引用,而不是像静态强制转换这样的简单对象呢?

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

bar b{};

auto sliced = dynamic_cast<foo>(b);

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

dynamic-cast在存在关系(继承)时起作用在基类B和派生类D之间。如果我们使用非引用和指针类型,这意味着我们正在转换它们,那么我们需要转换运算符,例如运算符B()或运算符B(),并返回所需的内容

这里的情况不同:我们有一个对象,它有两个部分1。基本类型2。仅特定于派生类型。 在这里,当我们使用指针或引用进行强制转换时,它只是将指针切换到正确的部分,从类型中我们知道它可以移动多少地址来访问元素(字段)。

上、下和整个层次结构<代码>结构c:a,b{}
(假设
a
b
都有虚拟函数),
a*pa=newc;b*pb=动态广播(ap):
。但这是一个错误+1.
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);