gpt4 book ai didi

C++ 当派生类没有实现接口(interface)中的函数时怎么办

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:14 24 4
gpt4 key购买 nike

我希望这个问题没有在其他地方得到解答,我确实搜索了一个答案,但不能完全正确地制定搜索。

问题是,我有一个武器抽象类,其中包含武器所需的统计数据(如准确度、伤害等)。它是一个抽象类,因为有些武器对装填和伤害有不同的实现,但大多数武器没有。

Weapon 类有一个 DoT(结构)成员,以及 getDoT 成员函数。

问题是,并非所有武器都有 DoT。但在代码中的某个时刻,当处理攻击时,会调用 Wea​​pon::getDoT。当然,我之前添加了一个“has_DoT()”方法,所以我不处理一个单元化的DoT对象,但这是一个相当糟糕的解决方案。

处理此问题的最佳方法是什么?当并非所有派生对象实际上都具有抽象类中的成员时?

我一开始想过不要DoT成员/getDoT成员函数,只是在派生类Weapon_With_DoT上实现它们,但由于我的抽象类是Weapon,我仍然需要检查武器是否有一个 DoT,然后从 Weapon 类型转换为 Weapon_With_DoT 以访问 Weapon_With_DoT::getDoT 成员函数。它也不优雅,恰恰相反。

我希望这个问题得到了足够清楚的解释。 :)

最佳答案

not all weapons have a DoT

那么所有武器的基类都不应该提供getDoT。故事结束。

but since my abstract class is Weapon, I would still need a check to see if the the weapon has a DoT, and then typecast from Weapon to Weapon_With_DoT to access the Weapon_With_DoT::getDoT

这就是疯狂。

而不是像这样的代码

if (I can haz DoT) {
DoT = gets DoT from weapon somehow // null pointer or optional or dynamic_cast
doSomethingImportant(DoT)
}

试试这样的代码

weapon->doSomethingImportant();

其中 doSomethingImportant 是一个虚函数。它用 DoT 做某事,或者什么都不做,或者用 DoT 以外的东西做某事。 你不关心它的作用,你知道它适合这种武器。

如果出于任何原因(并且可能有正当理由)无法将doSomethingImportant 添加到Weapon,请尝试对Visitor 做同样的事情。 .

关于C++ 当派生类没有实现接口(interface)中的函数时怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33722694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com