【问题标题】:Abstract base class and hierarchy - C++抽象基类和层次结构 - C++
【发布时间】:2013-12-01 01:09:26
【问题描述】:

我有一个抽象类 IExecutable

class IExecutable
{
public:
    virtual ActionStatus Execute() = 0;
};

使用中间类 Action

class Action : public IExecutable
{
    virtual ActionStatus Execute();
};

它实现了 Execute() 和其他最终类,例如 GoTo

class GoTo : public Action
{
    ...
};

GoTo 没有实现 Execute()。编译器将 GoTo 视为一个抽象类,因为它没有实现 Execute()。

两个问题: Action 实现 Execute() 的事实是否足以让 GoTo 不需要实现它? 如果没有,那将如何解决?当所有最终操作都相同时,必须为每个最终类重新实现 Execute() 是没有意义的。

【问题讨论】:

  • 这实际上应该可以正常工作,你确定你在中间体中正确实现了 Execute() 吗?
  • 您的示例在 VC 中编译,提供 Action::Executable 已定义。
  • 这为我编译,假设我定义了虚拟 ActionStatus Execute();除了那里的声明。 (例如,通过将“;”更改为“{}”)
  • 它有点奇怪,也是潜在的麻烦来源,Execute 没有在类 Action 的公共部分声明。

标签: c++ inheritance hierarchy abstract


【解决方案1】:

听起来这不是故事的全部。 GoTo 将是抽象的,如果有任何纯虚函数没有在层次结构的某处实现。

在 C++11 中,您可以确保使用 override 关键字正确实现 Execute

virtual ActionStatus Execute() override;

如果您不小心声明了新的虚函数而不是覆盖,这将导致特定的诊断。

您可以使用final 指定GoTo 不是任何东西的基础,如果它是抽象的,这可能会导致编译器报错(但这可能不是必需的):

class GoTo final : public Action

无论如何,编译器应该告诉你哪些函数没有实现来帮助你追踪这种错误。

【讨论】:

  • 这是我收到的错误消息 d:\abertay\goap\goap\stab.cpp(34): error C2259: 'GOAP::Stab' : cannot instantiate abstract class 1> 由于以下原因成员: 1> 'GOAP::ActionStatus GOAP::IExecutable::Exectue(void)' : 是抽象的 1> d:\abertay\goap\goap\iexecutable.h(11) : 见 'GOAP::IExecutable 的声明: :执行'
  • @albizgil 你拼错了Executeoverride 标签会更明确地捕捉到这一点。
  • 好尴尬!
  • 但令人沮丧的常见 :)
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多