Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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,在这里,第二个演员给出了一个错误的说法 cast.cc:35:35:错误:无法将“base”(类型为“class CBase*”)动态转换为“class CDerived*”(源类型不是多态的) CBase*base=new-CDerived; CBase*pb; CDerived*der=新的CDerived; CDerived*pd; pb=动态_铸造(der);//确定:导出到基 pd=动态_铸造(基础);//错误:从基到派生 这意味着什么 如果我使基类具有多态性,那么为什么会这样呢 请

在这里,第二个演员给出了一个错误的说法

cast.cc:35:35:错误:无法将“base”(类型为“class CBase*”)动态转换为“class CDerived*”(源类型不是多态的)

CBase*base=new-CDerived;
CBase*pb;
CDerived*der=新的CDerived;
CDerived*pd;
pb=动态_铸造(der);//确定:导出到基
pd=动态_铸造(基础);//错误:从基到派生
这意味着什么

如果我使基类具有多态性,那么为什么会这样呢


请告诉我这个背后的基本概念。

,因为标准是这样说的(参见C++标准中的[ Exp.Dista.Case]):

<代码>动态播放(v)

v
应为指向多态类型的指针或左值

在实践中,因为实现动态向下转换(即从基到派生)所需的是与一起生成的,如果没有多态成员函数,则不需要

另一方面,向上转换(即派生到基础)不需要RTTI(不需要进行运行时决策)。引用本标准同一章节:

结构B{}; 结构D:B{}; 无效foo(D*dp){ B*bp=dynamic_cast(dp);//相当于B*bp=dp; }
当编译器知道它是一个派生到基的转换时,它是否用静态的_转换来代替动态的_转换?这就是你的意思,对吧?@MarkRansom:我想这就是我的意思,但我不会把它说得很清楚,以防它错了!
    CBase * base = new CDerived; 
    CBase* pb;
    CDerived * der = new CDerived; 
    CDerived* pd;
    pb = dynamic_cast<CBase*>(der);     // ok: derived-to-base
    pd = dynamic_cast<CDerived*>(base);  // wrong: base-to-derived
struct B { };
struct D : B { };
void foo(D* dp) {
    B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}