纯虚函数和内联函数的定���

4

请考虑:

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

int main()
{

}

我写的代码类似下面的代码,但是它给出了一个错误:

函数定义上的纯说明符 由于-Wfatal-errors编译终止。

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

在类中声明的虚函数应该被定义或在该类中声明为纯函数(10.4),但不需要进行诊断(3.2)。

我似乎不能理解它的意思,我认为这与我的问题无关。
PS: 如果这不是相关的引用,请引导我找到正确的引用,以便我能够得到更好的反驳。

3
请访问 https://dev59.com/YXA85IYBdhLWcg3wEPZL。 - czchen
1
嗯,证实了我的怀疑。维基链接指向标准C++ 98 - 10.4/2。这里提到:“[注意:函数声明不能同时提供纯说明符和定义——结束注释]”,这澄清了情况。所以这不是我同事给我展示的引用。 - Nivhus
@Nivhus:是的,10.4/2 是正确/相关的引用。 - Prasoon Saurav
标准中的引用意味着未定义非纯虚拟函数是一个错误。这是一个不同但相关的要求。 - aschepler
2个回答

5

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

C++03[第10.4/2]节说:

[Note: a function declaration cannot provide both a pure-specifier and a definition —end note] [Example:

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

然而,您可以自由地编写内容

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

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

int main()
{

}

是的,我知道这个。谢谢。但我想知道我的同事给我展示的引用在这种情况下是否正确。如果不是,那么这句话的真正含义是什么? - Nivhus
如果在标准中某个东西被放在 [Note][注释] 标签中,这意味着什么?一般来说,在我看来,注释是可选阅读的内容。 - Nivhus
2
@Nivhus:它的意思是虚函数可以在类中定义,可以声明为纯虚函数,也可以同时声明为纯虚函数并定义(在类外定义){可选} - Prasoon Saurav
哦,那对我来说有点困惑。我把那个语句看成了内联定义。你们不觉得这很让人困惑吗?还是说只有我在读/解释标准方面比较新手? - Nivhus
@Nivhus:是的,我有时也觉得这段文字很令人困惑。为什么不从一本好书中阅读,而不是直接从标准中阅读呢? - Prasoon Saurav
我目前的挑战是理解这个概念并反驳我的同事对那句话的解释。我认为这个帖子中的讨论有所帮助。也许我的同事也是这个标准世界的新移民(虽然看起来很有趣)。 - Nivhus

-1
你可以拥有一个“纯虚函数”,即基类没有实现该函数。
virtual void switchon() = 0;

并且可选地提供一个实现,派生类必须覆盖它。

void base_class::switchon() {}

或者

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

virtual void switchon() {}

谢谢。我想知道我同事给我展示的引用在这个上下文中是否正确。 - Nivhus
1
您可以实现一个纯虚函数(顺便说一下,这意味着派生类必须覆盖它,而不是没有实现)。但您不能在声明中放置该函数的函数体。 - Ben Voigt
@Ben Voigt 对于评论和其他给我点踩的用户:非常感谢。我之前不知道这个,今天学到了新东西。 - Arun
你的语法还是有点问题--在实现中,无论是纯虚函数还是非纯虚函数,都不应该有 = - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接