C++:错误LNK:由虚函数产生的未解析的外部符号

Seb*_*rst 8 c++ virtual interface lnk2019

我界面的类等概述!

Animal.H:

class Animal
{
public:
   virtual void walk();
}
Run Code Online (Sandbox Code Playgroud)

Animals.CPP

=空

Cow.H:

class Cow : public Animal
{
public:
   virtual void walk();
}
Run Code Online (Sandbox Code Playgroud)

在这里它应该从语义上知道函数walk是从它从右派生的类中获取的?(ea Animal ..)当我不定义函数walk时,它应该说我应该正确定义它?

Cow.CPP:

void Cow::walk()
{
   //do something specific for cow
}
Run Code Online (Sandbox Code Playgroud)

SomeOtherClass.H

namespace SomeNamespace
{
   void LetAnimalWalk();
}
Run Code Online (Sandbox Code Playgroud)

SomeOtherClass.CPP

Cow myCow;
namespace SomeNamespace
{
   void LetAnimalWalk()
   {
      myCow.walk();
   }
}
Run Code Online (Sandbox Code Playgroud)

这应该工作正常吗?...我的意思是,命名空间,"Class :: ..."的东西?以及我继承和使用界面的方式?

因为这种方式我得到了我从界面制作的每个功能,所以每个虚函数都给我以下错误:

SomeOtherClass.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Cow::Walk (...etc etc...) referenced in function "void __cdecl SomeNamespace::LetAnimalWalk() (...etc etc...)
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么,我找到的主要是它意味着我没有宣布一个正确的功能(在Cow.cpp的某个地方?)

先谢谢你们

Bar*_*klı 10

class Animal
{
public:
   virtual void walk();
}
Run Code Online (Sandbox Code Playgroud)

您需要定义该功能或使其成为纯虚拟功能.


Jac*_*ley 6

如果您有一个不想在基类中定义的虚函数,则需要将其设为抽象,这是使用以下语法完成的:

class Animal
{
public:
   virtual void walk() = 0;
}
Run Code Online (Sandbox Code Playgroud)

如果没有这个,你将得到一个错误,如果没有定义它,如果任何派生类没有定义它,你将得到一个错误.