虚函数C ++:虚函数已经有了一个体

时间:2015-11-04 14:26:46

标签: c++ virtual

我在实现在另外两个类中的抽象类中声明的虚函数时遇到了麻烦。

当我在类ProtocolLogin中实现已经在ProtocolGame上实现的虚函数“parsePacket”时,编译器返回“function has has body”。

read_csv

然后我尝试创建一个名为parseWater的新虚函数,它只在Class ProtocolLogin中实现,编译器返回“函数需要在ProtocolGame中声明”,但如果我这样做,我会再次:“function已经有一个身体“。所以,我只是不再关注了。请帮助我理解:)

它就像一个无尽的圈子。

Error   1   error LNK2005: "private: virtual void __cdecl ProtocolGame::parsePacket(class NetworkMessage &)" (?parsePacket@ProtocolGame@@EEAAXAEAVNetworkMessage@@@Z) already defined in protocolgame.obj

Error   2   error LNK2001: unresolved external symbol "public: virtual void __cdecl ProtocolLogin::parsePacket(class NetworkMessage &)" (?parsePacket@ProtocolLogin@@UEAAXAEAVNetworkMessage@@@Z)

3 个答案:

答案 0 :(得分:0)

我对C ++ 11,并不十分熟悉,但是想要实现虚函数的派生类也需要将它们的实现声明为virtual。我不认为final无需陈述virtual。 (事实上​​,将非虚函数声明为final 是错误的)

如果您发现,您的父班已定义parseWater()virtual,但parseAlchohol()ProtocolAlchohol班级没有问题声明void parseAlchohol() final;ProtocolWatervoid parseWater() final;

有问题

ps,如果您明确提到父类中的子类概念(即水和酒精),并且基于命名函数,我不确定您是否正确获得派生和OOP在水与水alchohol。

编辑:别介意我的第一段。我想我总是把它作为惯例来做,并没有意识到这是不必要的。

答案 1 :(得分:0)

parseWater是唯一被声明为final的最终函数。

所有其他final函数在某处都没有virtual个关键字。

正如StoryTeller所指出的那样“你不必在派生的类中重述虚拟说明符。”

答案 2 :(得分:0)

由于我们正在讨论在派生classess中使用virtual,我想发表一个声明。不幸的是,在我看来,C ++在这方面是不一致的。您可能会或可能不会“重申”虚拟。更糟糕的是,当一个函数在基类中不是虚函数时,你可以使它成为虚函数 - 这可能会给代码阅读器一个虚函数的指示 - 这是一个错误的指示。

如果C ++实际上强制使用虚拟代码,那么代码维护者就会容易得多 - 在虚拟函数的所有重新定义中都需要它,并且禁止在非虚拟函数上重新定义。