2011-01-07 15 views
-1

C++では、virtualは次のように使用されていますか?両者の違いは何ですか?仮想差分構文C++

class Animal 
{ 
public: 
    virtual void something(); 
    virtual void something() = 0; 
} 

答えて

1

私はこれにあいまいかもしれませんが、私は最初のことを言っていると思います:私を無効にすることができます、そして、第二に、を無効にする必要があります。

+0

少なくとも1つの 'virtual ...()= 0; 'を持つクラスは抽象クラスと呼ばれます。抽象クラスのインスタンスを作成することはできません。そうしないと、コンパイラは不平を言うでしょう。 –

1
virtual void something() = 0; // says it is a pure virtual function 
virtual void something(); // is a virtual function 

そして、少なくとも1つの純粋仮想関数を含むクラスは、抽象基底クラスと通常のポリモーフィッククラス間のclasses.The主な違い抽象ベースと呼ばれているがあることの理由は、抽象基底クラスに少なくとも1つのメンバーには実装がないため、インスタンス(オブジェクト)を作成できません。

0

2番目の「something」はサブクラスで実装する必要があり、「xxx()= 0」を含むクラスは直接インスタンス化できません。これは "純粋仮想"関数と呼ばれ、それらを含むクラスは "抽象"です。純粋なバーチャルだけを含むクラスは、「純粋な抽象」です。

1

最初に、機能が仮想であること:サブクラスが動作を上書きできることを示します。しかし、この関数はまだ基本クラスに実装されています。 2番目は純粋な仮想です:実装がなく、サブクラスでオーバーライドする必要があります。これは、JavaおよびC#のキーワードabstractに似ています。クラスを抽象化するので、インスタンス化することはできません。

+1

純粋なバーチャル実装が実装されている可能性があります(純粋な仮想デストラクタの場合は実装が必要です)が、実装は仮想ディスパッチを使用して呼び出されません。これは、派生クラスが親に実装された基本的な処理を呼び出すと予想される場合によく使用されます。 http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained/1306796#1306796 – Suma

0

最初に仮想メソッドを宣言しています。クラスを拡張してそのメソッドをオーバーライドすると、子クラスの実装が呼び出されます。

2番目は純粋な仮想メソッドです。言い換えれば、あなたのクラスまたはそれを拡張するクラスは、何かの定義を最初に提供することなくインスタンス化(抽象化)されません。

0

を考えてみましょう: - 動物とナマケモノ

ここ
class Sloth : public Animal { void something() { ... } }; 

Animal animal; 
Sloth sloth; 

を、我々は2つのオブジェクトを作成しようとしています。しかし、私たちは動物を作ることを許可されるべきですか?彼らはその後、p_animal->something()が有用な何かを期待するかもしれない

std::vector<Animal*> zoo; 
zoo.push_back(new Sloth()); 
zoo.push_back(new Sea_Eagle()); 

:おそらくプログラマはのように、派生型に多形参照するために使用することができますだけので、動物を作成しました。 Animalは、この多態的抽象化のためにのみ意図されているので、実際の "新しいAnimal()"オブジェクトを動物園に直接置く(つまり、プログラム内の他の場所で操作する)のは間違いでしょう。

可能であれば、このAnimalクラスを使用しているプログラマがインスタンスを作成してsomething()関数を呼び出すとどうなりますか?おそらく何もない、あるいはエラー状態であり、良いコードで表示されるべきではない - Animalのsomething()関数がエラーメッセージを出力するか、実行時に例外をスローするのではなく。これは醜い - ランタイムエラーは、クライアントがそれを使用しようとしているときにプログラムが失敗していることを意味します。

コンパイラは(基本クラス)を防止するために知っているように、C++は、時間をコンパイルAnimalオブジェクトがで作成されている「= 0」記法をサポートしていますので、あなたは常にユーザーのために働くソフトウェアを出荷することができます。

関連する問題