230

純粋仮想関数と仮想関数の違いは何ですか?

「純粋な仮想関数は本体のない仮想関数です」は知っていますが、これは何を意味し、以下の行で実際に何が行われるのですか:

virtual void virtualfunctioname() = 0
4

4 に答える 4

282

仮想関数は、そのクラスを多態的な基本クラスにします。派生クラスは、仮想関数をオーバーライドできます。基本クラスのポインター/参照を介して呼び出される仮想関数は、実行時に解決されます。つまり、静的タイプの代わりにオブジェクトの動的タイプが使用されます。

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

純粋仮想関数は、宣言が で終わる仮想関数です=0

class Base {
  // ...
  virtual void f() = 0;
  // ...

純粋仮想関数は、クラスを抽象化するために定義されているクラスを暗黙的に作成します(クラス抽象化を明示的に宣言するキーワードがある Java とは異なります)。抽象クラスはインスタンス化できません。派生クラスは、継承されたすべての純粋仮想関数をオーバーライド/実装する必要があります。そうしないと、それらも抽象化されます。

C++ の興味深い「機能」は、クラスが実装を持つ純粋仮想関数を定義できることです。(それが何に役立つかは議論の余地があります。)


C++11 では、純仮想関数の構文に似たdeleteandキーワードが新たに使用されることに注意してください。default

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

このとの使用の詳細については、この質問この質問を参照してください。deletedefault

于 2010-04-16T10:37:48.690 に答える
38

仮想関数の場合、基本クラスで実装を提供する必要があります。ただし、派生クラスは、この実装を独自の実装でオーバーライドできます。通常、純粋仮想関数の実装は提供されません。=0関数宣言の最後に を使用して、関数を純粋仮想にすることができます。また、純粋仮想関数を含むクラスは抽象的です。つまり、このクラスのオブジェクトを作成することはできません。

于 2010-04-16T10:38:31.620 に答える
24

純粋仮想関数は、通常、基本クラスでは実装されませんが (実装は可能です)、リーフ サブクラスで実装する必要があります。

次のように、宣言に「= 0」を追加して、その事実を示します。

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

次に、純粋仮想関数を実装せずにサブクラスを宣言してインスタンス化することはできません。

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

キーワードを追加することによりoverride、コンパイラは、同じシグネチャを持つ基本クラスの仮想関数が存在することを確認します。

于 2010-04-16T10:36:00.303 に答える
10

実際には、C++で純粋仮想関数の実装を提供できます。唯一の違いは、クラスをインスタンス化する前に、すべての純粋仮想関数を派生クラスで実装する必要があることです。

于 2010-04-16T10:39:27.390 に答える