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

时间:2013-03-07 14:20:35

标签: c++ interface virtual lnk2019

我的界面的类等概述!

Animal.H:

class Animal
{
public:
   virtual void walk();
}

Animals.CPP

= EMPTY

Cow.H:

class Cow : public Animal
{
public:
   virtual void walk();
}

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

Cow.CPP:

void Cow::walk()
{
   //do something specific for cow
}

SomeOtherClass.H

namespace SomeNamespace
{
   void LetAnimalWalk();
}

SomeOtherClass.CPP

Cow myCow;
namespace SomeNamespace
{
   void LetAnimalWalk()
   {
      myCow.walk();
   }
}

这应该正常吗?...我的意思是,命名空间,“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...)

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

先谢谢你们

4 个答案:

答案 0 :(得分:10)

class Animal
{
public:
   virtual void walk();
}

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

答案 1 :(得分:6)

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

class Animal
{
public:
   virtual void walk() = 0;
}

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

答案 2 :(得分:3)

使基类中的函数为纯虚拟:

class Animal
{
    public:
        virtual void walk() = 0;
}

或定义一个简单的实现:

void Animal::walk()
{
   return;    // could also throw an exception here
}

答案 3 :(得分:1)

动物*动物=新牛();动物 - >步行();

牛myCow显然不起作用!