11

我的界面的类等概述!

动物.H:

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

动物.CPP

=空

牛.H:

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

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

牛.CPP:

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

其他类.H

namespace SomeNamespace
{
   void LetAnimalWalk();
}

其他类.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

4 回答 4

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

您需要定义该函数或使其成为纯虚拟函数。

于 2013-03-07T14:22:11.917 回答
9

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

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

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

于 2013-03-07T14:27:20.930 回答
3

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

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

或定义一个简单的实现:

void Animal::walk()
{
   return;    // could also throw an exception here
}
于 2013-03-07T14:46:48.613 回答
1

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

Cow myCow 显然不起作用!

于 2013-03-07T15:25:47.770 回答