gpt4 book ai didi

c++ - 使用子类类型子类化虚函数

转载 作者:行者123 更新时间:2023-11-28 04:59:17 25 4
gpt4 key购买 nike

我打开了一些编译器警告(C4263 和 C4264)并发现了这个错误:

class tCommand
{
...
};

class tTestModule
{
public:
virtual bool HandleCommand(tCommand&) { return false; }
}

class tCommandADCReadings : public tCommand
{
...
};

class tADCReadings : public tTestModule
{
public:
tADCReadings();

bool HandleCommand(tCommandADCReadings&);
}

bool tADCReadings::HandleCommand(tCommandADCReadings& cmd)
{
...
}

这显示了一个警告,因为 tADCReadings::HandleCommand() 的实现与 tTestModule::HandleCommand() 不匹配。所以我这样修复它:

class tADCReadings : public tTestModule
{
public:
tADCReadings();

bool HandleCommand(tCommand&) override;
}

bool tADCReadings::HandleCommand(tCommand& cmd)
{
tCommandADCReadings* pCmdADCReadings = dynamic_cast<tCommandADCReadings*>(&cmd);
}

但是另一个团队成员说我们应该保留在 tADCReadings::HandleCommand() 中使用 tCommandADCReadings 给我们的类型检查,所以只需删除 tTestModule::处理命令()。但是这个函数也在 10 个其他子类中使用,所以看起来很遗憾。是否有另一种方法来保持 virtual 并确保编译时类型正确性?

最佳答案

“是否有另一种方法来保持虚拟并确保编译时类型正确性?”答案取决于您如何在其余代码中使用 tCommand 对象。假设您的代码类似于:

typedef std::vector<std::shared_ptr<tTestModule>> module_list;

bool handle(tCommand& c, module_list const& m)
{
bool fin = false;
for (auto i = m.begin(), e = m.end(); i != e && !fin; ++i)
fin = (*i)->HandleCommand(c);

return fin;
}

在这种情况下,您有一个最终类型未知的 tCommand 对象,它被传递给各种最终类型也未知的 tTestModule 对象。在这种情况下,答案是否定的。您不能对两种未知类型进行运行时分派(dispatch)和编译时类型安全。

要获得编译时安全性,您需要至少了解以下涉及的一种类型:

template <class C>
bool handle(C& c, module_list const& m)
{
bool fin = false;
for (auto i = m.begin(), e = m.end(); i != e && !fin; ++i)
fin = (*i)->HandleCommand(c);

return fin;
}

但为了类型安全,您实际上需要为从 tCommand 派生的每个类型重载 tTestModule 中的 HandleCommand()。如果您还可以在编译时知道 m 中模块的类型(即按值使用模块的 std::tuple 而不是按引用的模块 vector ),您将拥有类型安全性而不会出现重载问题。

关于c++ - 使用子类类型子类化虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46457936/

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