13

基本クラスで共通の仮想関数を定義する利点は、派生クラスでそれらを再定義する必要がないことです。

基本クラス自体で純粋仮想関数を定義したとしても、派生クラスでもそれらを定義する必要があります。

#include <iostream>
using namespace std;

class speciesFamily
{
    public:
        virtual void numberOfLegs () = 0;
};

void speciesFamily :: numberOfLegs ()
{
    cout << "\nFour";
}

class catFamily : public speciesFamily
{
    public:
        void numberOfLegs ()
        {
            speciesFamily :: numberOfLegs ();
        }
};

これは確かに派手に見えるかもしれませんが、基本クラス自体に純粋仮想関数を定義する ことが有益な状況はありますか?

4

4 に答える 4

14

2つのこと:

まず、一般的に引用される境界線のシナリオが1つあります。抽象基本クラスが必要であるが、それに入れる仮想関数がないとします。つまり、純粋な仮想を作成する機能がないということです。現在、1つの方法があります。常に仮想デストラクタが必要なので、それを純粋にすることができます。しかし、実装も必要なので、それがあなたの候補です。

struct EmptyAbstract
{
  virtual ~EmptyAbstract() = 0; // force class to be abstract
};
EmptyAbstract::~EmptyAbstract() { } // but still make d'tor callable

これは、抽象クラスの実装サイズを最小化するのに役立つ場合があります。これはどういうわけかマイクロ最適化ですが、意味的に適合する場合は、このオプションがあると便利です。

2つ目のポイントは、派生クラスからいつでも基本クラス関数を呼び出すことができるため、抽象インスタンスが必要ない場合でも、「共通の」機能セットが必要な場合があるということです。繰り返しますが、純粋仮想定義関数が登場します。

struct Base
{
  virtual void foo() = 0;
};

struct Derived : Base
{
  virtual void foo()
  {
    Base::foo();  // call common features
    // do other stuff
  }
};

void Base::foo() { /* common features here */ }
于 2011-11-09T11:27:27.400 に答える
11

基本クラス自体に純粋仮想関数を定義することが有益な状況はありますか?

はい-問題の関数が純粋な仮想デストラクタである場合は、基本クラスによっても定義されている必要があります。

于 2011-11-09T11:12:53.437 に答える
0

純粋仮想関数のみを持つ基本クラスは、Javaのような言語がインターフェースと呼ぶものです。利用可能な機能を説明するだけで、他には何もありません。

于 2011-11-09T11:01:23.687 に答える
0

基本クラスに純粋仮想関数を適切に実装できない場合に役立ちます。この場合、純粋仮想関数は派生クラスに実装されます。

于 2011-11-09T11:02:58.507 に答える