C++ C++;动态循环下播';I don’我没有按预期工作

C++ C++;动态循环下播';I don’我没有按预期工作,c++,C++,我正在做一个程序来学习模板类和dynamic\u cast使用。 它使用模板类(a)来创建B类指针的列表。在循环中,它检查每个指针是否指向C对象,然后执行其Print()方法 下面的代码应该输出两次“C CALL”,但它只输出“Start!”。我错过了什么 #包括 模板 甲级 { 公众: std::向量值; 虚拟~A(){} 无效添加(无效*val) { 小部件类型*目标=(小部件类型*)val; 值。推回(目标); } }; B类 { 公众: 虚拟~B(){} }; 丙类:乙类 { 公众: 作

我正在做一个程序来学习模板类和
dynamic\u cast
使用。 它使用模板类(
a
)来创建
B
类指针的列表。在循环中,它检查每个指针是否指向
C
对象,然后执行其
Print()
方法

下面的代码应该输出两次
“C CALL”
,但它只输出
“Start!”
。我错过了什么

#包括
模板
甲级
{
公众:
std::向量值;
虚拟~A(){}
无效添加(无效*val)
{
小部件类型*目标=(小部件类型*)val;
值。推回(目标);
}
};
B类
{
公众:
虚拟~B(){}
};
丙类:乙类
{
公众:
作废打印()
{
标准::不能添加(d1);
索引->添加(c2);
for(无符号整数i=0;i<3;i++)
{
B*val=索引->值[i];
C*目标=动态施法(val);
如果(目标)
{
目标->打印();
}
}
}

您缺少的是知道如何使用调试器来运行您的程序,一次一行,并准确地查看程序的功能。这就是调试器的作用。当您运行此程序时,调试器向您展示了什么?另外,您还缺少未定义的行为。每次在C中看到
void*
++程序,它不被用来与C代码接口,它几乎总是一个保证的bug。而且,在这种情况下,C++不这样工作(用<代码替换<代码> Value*/Cuff> > WigGigyType */Cube > <代码> Addio.[/Cord] >可能会修复bug)。。我调试了它,它显示dynamic_cast没有返回C*指针,但是,它显示val是B*指向C对象。这就是真正让meCasting to/from
void*
感到困惑的地方,就这里的目的而言,它相当于
重新解释\u cast
。你实际上是在
重新解释类的属性t类,分两个独立的步骤。这是一个非常可疑的命题。“意味着我必须更改索引->添加(c1);到索引->添加((B)c1);”除非你的编译器被破解或者你的实际代码有很大的不同。编辑:好的,如果你正在做公共继承,它将正确工作。只需改变公共的,让DycReCype强制运行,但是对你的代码不是完全正确的答案。C++不保证从C*到Value*和C风格CA的强制转换。sting to B*的结果是正确的B*。它只是碰巧起作用,当不正确的代码出现时,这实际上是不好的。