我在头中声明了两个c++类。基类声明一个虚拟方法,第二个类重写它。实现在.cpp文件中。
代码相当简单
void DefendProperty::apply(Queue<Defend*>* defendQueue,
const Tool* toolSource, const Actor* actorSource, const Actor* defender) {
cout << "BASE" << endl;
}void DefendPropertyPhysical::apply(Queue<Defend*>* defendQueue,
Tool* toolSource, const Actor* actorSource, const Actor* defender) {
cout << "CORRECT" << endl;
defendQueue->enqueue(new Defend(
DefendTypePhysical::TYPE,
new DamageValuesPhysical(
getRandomDouble(minDamageReduction, maxDamageReduction))
));
}问题是,当我调用实例化为B的类时,它输出基,而不是正确的。我不知道这是怎么回事。
这些类存储在没有apply方法的基本ToolProperty类型中。当它们被调用时,会使用DefendProperty将它们输入到dynamic_cast类型中。
dynamic_cast<DamageProperty*>(node->value)->apply(damageQueue, toolSource, actorSource);如能提供任何帮助,将不胜感激。
发布于 2012-05-07 18:43:04
派生类中方法的签名与基类中的签名不同。(一个是const Tool*,另一个是非const Tool*)
由于签名不同,派生类的方法并不覆盖基类的方法,而是声明了一个新的、无关的方法。
发布于 2012-05-07 18:43:01
你的功能有不同的签名。查看"toolSource“的类型。第二个不是第一个的覆盖,而是一个过载。
编译器几乎永远不会警告您的常见错误。我不知道有谁能做到。
顺便说一句,如果要在指针上使用动态强制转换而不检查结果,就没有理由使用它。
发布于 2012-05-07 18:42:54
toolSource不在DefendPropertyPhysical。如果签名不匹配,c++编译器将不会假设您犯了错误,它只是假设您声明了该方法的新重载。C++11的显式覆盖在这方面有帮助。DefendProperty::apply在标题中标记为virtual。https://stackoverflow.com/questions/10487260
复制相似问题