【问题标题】:Pure virtual and inline definition纯虚拟和内联定义
【发布时间】:2011-04-19 16:02:11
【问题描述】:

考虑:

struct device{
    virtual void switchon() = 0 {}
};

int main()
{

}

我写了类似下面的代码,但是报错了:

函数定义上的纯说明符 编译因 -Wfatal-errors。

当我问他时,他向我展示了标准中的以下引用:

在类中声明的虚函数 应被定义或声明为纯的 (10.4) 在该类别中,或两者兼有;但不是 需要诊断 (3.2)。

我似乎无法理解它的含义,而且我认为这在某种程度上是不相关的。

PS:如果这不是相关的引用,请引导我找到正确的引用,以便我有更好的反驳。

【问题讨论】:

  • 嗯。证实了我的怀疑。 Wiki 链接指向标准 C++ 98 - 10.4/2。这里提到了“[注意:函数声明不能​​同时提供纯说明符和定义——尾注]”,这说明了这种情况。所以这不是我同事给我看的引述
  • @Nivhus :是的10.4/2 是正确/相关的报价。
  • 标准中引用的意思是,未能定义非纯虚拟的虚函数是错误的。不同但相关的要求。

标签: c++


【解决方案1】:

一个纯虚函数可能有一个定义(类外定义)。那是完全可选的。但是您尝试做的事情是完全错误的,因为

C++03 [Section 10.4/2] 说:

[注意:函数声明不能同时提供纯说明符和定义——尾注] [示例:

struct C {
    virtual void f() = 0 { }; // Ill-formed
}

随便写吧

struct device{
    virtual void switchon() = 0;
};

void device::switchon() { } // Definition {optional}

int main()
{

}

【讨论】:

  • 是的,我知道这一点。谢谢。但我想知道我的同事给我看的引述在这种情况下是否正确。另外,如果不是,那句话的真正含义是什么?
  • 如果标准中的 [Note][Note] 标记中有内容是什么意思?一般来说,我认为注释是可选的阅读内容
  • @Nivhus :意思是A virtual function can be defined in the class, can be declared pure or can be declared pure as well as can be defined(out of class definition) {optionally}
  • 哦。这让我很困惑。我读了那句话,好像它是关于内联定义的。你们是不是也觉得这很令人困惑,还是我不熟悉阅读/解释标准?
  • @Nivhus :是的,我还发现 sometimes 的文字令人困惑。与其直接阅读标准,不如阅读一本好书?
【解决方案2】:

你可以有一个“纯”虚函数,即基类没有函数实现

virtual void switchon() = 0;

并且可选地提供派生类必须覆盖的实现。

void base_class::switchon() {}

你可以有一个“非纯”的虚函数并提供一个默认的或空的实现

virtual void switchon() {}

【讨论】:

  • 谢谢。我想知道我的同事给我看的这句话在这种情况下是否正确
  • 你可以实现一个纯虚函数(顺便说一句,派生类必须覆盖它,而不是没有实现)。你不能做的是将正文放在声明中。
  • @Ben Voigt 评论和其他投反对票的用户:非常感谢。我不知道这一点,今天学到了一个新东西。
  • 你的语法还是有点搞笑——在实现中应该没有=,不管是不是纯虚拟的。
猜你喜欢
  • 2014-04-16
  • 2011-05-09
  • 2014-05-25
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多