1

我在标题中声明了两个 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 的类时,它输出 BASE,而不是 CORRECT。我不知道此时发生了什么。

这些类存储在没有 apply 方法的基本 ToolProperty 类型中。当它们被调用时,它们会使用 dynamic_cast 类型转换为 DefendProperty 类型。

dynamic_cast<DamageProperty*>(node->value)->apply(damageQueue, toolSource, actorSource);

任何帮助,将不胜感激

4

3 回答 3

3

派生类中方法的签名与基类中的方法不同。(一个需要 a const Tool*,另一个需要一个 non-const Tool*

由于不同的签名,派生类的方法不会覆盖基类的方法,而是声明一个新的、不相关的方法。

于 2012-05-07T18:43:04.993 回答
1

您的函数具有不同的签名。查看“toolSource”的类型。您的第二个不是第一个的覆盖,而是超载。

编译器几乎不会警告您的常见错误。反正我不知道有哪一个。

顺便说一句,如果您要在指针上使用动态转换而不检查结果,则没有理由使用动态转换。

于 2012-05-07T18:43:01.457 回答
0
  1. 确保函数签名相同。toolSource不是 const in DefendPropertyPhysical。如果签名不匹配,c++ 编译器不会假定您犯了错误,它只会假定您正在声明该方法的新重载。C++11 的显式覆盖对此有所帮助。

  2. 确保在标题DefendProperty::apply中标记为。virtual

于 2012-05-07T18:42:54.337 回答