我在实现在另外两个类中的抽象类中声明的虚函数时遇到了麻烦。
当我在类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)
答案 0 :(得分:0)
我对C ++ 11,并不十分熟悉,但是想要实现虚函数的派生类也需要将它们的实现声明为将非虚函数声明为virtual
。我不认为final
无需陈述virtual
。 (事实上,final
是错误的)
如果您发现,您的父班已定义parseWater()
且virtual
,但parseAlchohol()
,ProtocolAlchohol
班级没有问题声明void parseAlchohol() final;
,ProtocolWater
与void parseWater() final;
ps,如果您明确提到父类中的子类概念(即水和酒精),并且基于命名函数,我不确定您是否正确获得派生和OOP在水与水alchohol。
编辑:别介意我的第一段。我想我总是把它作为惯例来做,并没有意识到这是不必要的。
答案 1 :(得分:0)
parseWater
是唯一被声明为final
的最终函数。
所有其他final
函数在某处都没有virtual
个关键字。
正如StoryTeller所指出的那样“你不必在派生的类中重述虚拟说明符。”
答案 2 :(得分:0)
由于我们正在讨论在派生classess中使用virtual
,我想发表一个声明。不幸的是,在我看来,C ++在这方面是不一致的。您可能会或可能不会“重申”虚拟。更糟糕的是,当一个函数在基类中不是虚函数时,你可以使它成为虚函数 - 这可能会给代码阅读器一个虚函数的指示 - 这是一个错误的指示。
如果C ++实际上强制使用虚拟代码,那么代码维护者就会容易得多 - 在虚拟函数的所有重新定义中都需要它,并且禁止在非虚拟函数上重新定义。