0

通常のメソッドも持つインターフェイスがありますが、それを呼び出すにはどうすればよいですか?

class Animal{
   virtual void virtualFunction()=0;
}

class Cow : Animal{
   virtual void virtualFunction(){}
   void nonVirtualFunction(){}
}

class main{
   Animal *a = new Cow();
   a->virtualFunction();
}

^:これは動作しますが、動作すると...

a->nonVirtualFunction();

クラスAnimalにはこのメソッドがないと言われていますが、もちろん知っていますが、そのメソッドを呼び出すにはどのような方法が最適ですか?

4

3 に答える 3

3

のメンバーである関数を呼び出す場合は、そもそもCowポリモーフィックポインタに格納しないでください。Animal

Cow* c = new Cow();
c->nonVirtualFunction();

特定の方法で使用する場合はCow、をに格納することは意味がありません。Animal*Cow

実行時にオブジェクトの動的タイプをチェックするために使用できます。dynamic_cast

Animal* a = new Cow();
if (Cow* c = dynamic_cast<Cow*>(a)) {
  c->nonVirtualFunction();
}

ただし、これは通常、設計が悪いことを示しています。

于 2013-03-19T14:35:03.270 に答える
1

nonVirtualFunctionを呼び出すには、Cowポインターを使用する必要があります。動物ポインタは、動物のインターフェイスを持つ牛のサブセットへのポインタです。

nonVirtualFunctionを呼び出す唯一の方法は、Cowポインターを取得することです。

Cow *c = dynamic_cast<Cow*>(a); 

本当に牛を指していると仮定すると、そのようなポインタが得られます。

于 2013-03-19T14:35:11.277 に答える
1

自分自身をよりよく説明するために、プレースホルダーの代わりにメソッドに実際の名前を使用します。

class Animal{
   virtual void move()=0;
}

class Cow : Animal{
   virtual void move(){}
   void moo(){}
}

int main () {
   Animal *a = new Cow();
   a->move();
   a->moo(); // ERROR
}

もちろん、それは誤りです。一体なぜジェネリックを作成したいのでしょうAnimal mooか? したがって、問題はどのように呼び出すかではありませmooAnimal。たまたま、この呼び出しは無意味であり、コンパイラは私たちが気付くのを助けます.

現在、 には、Animalサブクラスで書き換える必要なく任意の動物で呼び出すことができる非仮想メソッドがある場合があります。たとえば、次のようになります。

class Animal{
   // Everything else, plus:
   std::string Name() {return name;}

private:
   std::string name;
}

int main () {
   Animal *a = new Cow();
   a->move();
   std::string animalName = a->Name(); // OK
}

ご覧のとおり、優れた設計があれば問題は解消されます。

于 2013-03-19T14:44:32.053 に答える