首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有调用c++虚拟方法

没有调用c++虚拟方法
EN

Stack Overflow用户
提问于 2012-05-07 18:39:05
回答 3查看 191关注 0票数 1

我在头中声明了两个c++类。基类声明一个虚拟方法,第二个类重写它。实现在.cpp文件中。

代码相当简单

代码语言:javascript
运行
复制
void DefendProperty::apply(Queue<Defend*>* defendQueue, 
const Tool* toolSource, const Actor* actorSource, const Actor* defender) {
    cout << "BASE" << endl;
}
代码语言:javascript
运行
复制
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类型中。

代码语言:javascript
运行
复制
dynamic_cast<DamageProperty*>(node->value)->apply(damageQueue, toolSource, actorSource);

如能提供任何帮助,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-07 18:43:04

派生类中方法的签名与基类中的签名不同。(一个是const Tool*,另一个是非const Tool*)

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-07 18:43:01

你的功能有不同的签名。查看"toolSource“的类型。第二个不是第一个的覆盖,而是一个过载。

编译器几乎永远不会警告您的常见错误。我不知道有谁能做到。

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

票数 1
EN

Stack Overflow用户

发布于 2012-05-07 18:42:54

  1. 确保函数签名是相同的。toolSource不在DefendPropertyPhysical。如果签名不匹配,c++编译器将不会假设您犯了错误,它只是假设您声明了该方法的新重载。C++11的显式覆盖在这方面有帮助。
  2. 确保DefendProperty::apply在标题中标记为virtual
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10487260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档