11

私のインターフェースのクラスなどの概要!

Animal.H:

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

Animals.CPP

=空

Cow.H:

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

ここで、関数walkが派生したクラスから取得されていることを外見的に知る必要がありますか?(ea Animal ..)関数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

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

動物*動物=新しい牛(); 動物->散歩();

牛myCowは明らかに機能しません!

于 2013-03-07T15:25:47.770 に答える