2013-02-25 15 views
7

はすべての時間を私は今、C++、OO側を学んでいる、と私はこれを得た:仮想の間のC++の差= 0;そして空の関数

class SomeClass{ 
    virtual void aMethod()=0; 
} 

class AnotherClass{ 
    void anotherMethod(){/*Empty*/} 
} 

class SomeClassSon : public SomeClass{ 
    void aMethod(){/*Also Empty*/} 
} 

私の疑いがある:3つの方法の違いは何ですか。仮想はゼロ、空の仮想、仮想は継承されているため空です。

は、なぜ私は父のようSomeClassSonメソッドを作成することはできません(仮想ボイドはゼロに等しい?)

+0

'SomeClass s; s.aMethod() 'は有効な呼び出しではありません。 – andre

+3

違いは、基本クラスの '= 0'では、すべての派生クラス*がメソッドを実装しなければならないということです。 –

+2

@DavidSchwartz - クラスがインスタンス化されている場合*関数を実装する必要があります*。関数が実装されていない場合、クラスは抽象クラスです。 –

答えて

10

。あなたのクラスにこのような純粋な仮想メソッド=0が1つあれば、そのクラスをインスタンス化することはできません。さらに、派生クラスはすべて純粋な仮想aMethod()を実装する必要があります。そうしないと、抽象クラスにもなります。

派生クラスでは、上から純粋仮想メソッドを上書きするため、派生クラスは抽象クラスになりません。この派生クラスをインスタンス化できます。

しかし、派生クラスでは、メソッドの本体は空です。そういうわけで、あなたの質問は理にかなっています。クラスを純粋な仮想にするのはいかがですか。あなたのクラスは他の方法を必要とするかもしれません。その場合は、SomeClassをインスタンス化することはできません(純粋な仮想メソッドがあります)。一方、子クラスSomeClassSonは可能です。

AnotherClassにも同じことが適用されますが、これはSomeClassとは逆にインスタンス化できます。

6

差がvirtual void aMethod() = 0があることを意味し、pure virtual functionであるということです:?

  1. SomeClassになります抽象基本クラス はインスタンス化できません。
  2. SomeClassから継承するクラスはaMethodを実装しなければならない、またはそれはあまりにも一個の以上の純粋仮想関数を持つクラスが自動的に抽象基底クラスであることを

注意をインスタンス化できない抽象基底クラスとなります。

+1

あなたは正しいことを意味しているかもしれませんが、間違っています:「SomeClass」から派生したクラスは、関数を実装することを強制されませんが、抽象クラスではありません。 –

1

純粋なvirtualがクラス抽象化を行います。空でない非仮想メソッドは何もしません。呼び出ししようとするとリンカーエラーに繋がります。対照的に、純粋なvirtualを呼び出すことはできません(コンストラクタから呼び出そうとしない限り、どちらかといえば悪いです)。コンパイラはそのオブジェクトを作成させないためです。

論理的な違いもあります。virtualと表示されたメソッドは、継承チェーンを介して仮想になります。他のメソッドは単なる通常のメソッドです。

1

純粋な仮想関数(最初の例は=0)は、そのクラスのオブジェクトがインスタンス化されるためには派生クラスで関数をオーバーライドする必要があることを意味します。

2つ目は、基本的には何もしない単なるメンバー関数です。関数の名前が異なり、クラスがSomeClassに関係しないため、2つのクラスは互いに影響しません。

純粋な仮想関数をオーバーライドするので、SomeClassSonをインスタンス化することはできますが、派生クラスではオーバーライドされた関数は何も行いません。

2

宣言aMethod()= 0は、このメソッドがサブクラスで提供される必要があることをコンパイラに通知します。メソッドを実装していないサブクラスはインスタンス化できません。これにより、基本クラスのどのオブジェクトにもメソッドが実装されるようになります。

3

あなたが参照している「等しい0」は、「純粋な仮想」と呼ばれています。それは、親クラスが存在しなければならない機能を定義することを意味するが、子がどのようにそれを行うかについての知識がないということを意味する基本機能を提供するのではなく、インスタンス化するHASを実装したい子供が、これにより、インスタンス化できないという点で抽象クラスになります。たとえば、私が継承できる「哺乳動物」クラスを定義したいと思うかもしれません。私はその子供たちにある種の行動を起こしたいのですが、単に「哺乳動物」を作ることはできません。代わりに私は "キリン"クラスを作成し、それが想定どおりに動作することを確認します。

このSOについても説明しています。

あなたが参照している "空の"機能は、機能が定義され、呼び出せる機能ですが、何もしません。あなたの

class SomeClass{ 
    virtual void aMethod()=0; 
} 

あなたのクラス抽象を作る純粋仮想メソッドの存在のために