2017-05-29 13 views
-5

純粋な仮想メソッドを以下のコードのように使用します。なぜこの純粋な仮想メソッドはコンパイルされませんか?

#include <iostream> 
using namespace std; 
class Advertisment 
{ 
public: 
    vitual void price (int Uchrg, int no_of_unt) = 0; 
    { 
    } 
}; 

class TVadvertisment : public Advertisment 
{ 
public: 
    void price (int Uchrg, int no_of_unt) 
    { 
     int adPrice = Uchrg * no_of_unt; 
     cout << "Advertisment Price: " << adPrice; 
    } 
}; 

int main() 
{ 
    TVadvertisment T; 
    T.price(1000, 60); 
    return 0; 
} 

純粋な仮想関数はvirtual void display() = 0;と宣言されています。しかしコード::ブロックコンパイラは、= 0のためにエラーを表示します。それがなければ、正常にコンパイルされます。

また、派生クラスのメソッドを呼び出すためのポインタも使用しませんでした。

+0

あなた自身の質問に[mcve] *を提供するようにあなたの質問を編集してください。 –

+0

_私は以下のようにPure Virtualを使用しています。 **質問に関連するすべてのコードをコピーして**貼り付けます。 –

+2

テキストの画像をリンクしないでください。関連情報をコピーしてあなたの質問に貼り付けてください。 – Rook

答えて

1

あなたの関数は純粋仮想です。つまり、メソッドが仮想であり、基本クラス(= 0)に実装されていないことを意味します。 そのあとのブロックを削除する必要があります。

それはすることがあります。

virtual price(int Uchrg, int no_of_unt) = 0; 

{ }なし。

仮想というのは、基本クラスから継承したクラスは、メソッドをオーバーライドして基本クラスインターフェイス経由で呼び出されることを意味します。クラスに純粋仮想メソッドがある場合、クラスは抽象クラスであり、この関数をインスタンス化するためにその基本クラスを継承するクラスによってこの関数をオーバーライドする必要があります。要するに

仮想:

virtual price(int Uchrg, int no_of_unt) 
{ 
    // Implementation 
} 

は実装がありますが、基本クラスです。サブクラスはではありません。は無効にする必要があります。クラスは抽象的ではなく、インスタンス化することができます。

仮想ピュア:何の実装はありません

virtual price(int Uchrg, int no_of_unt) = 0; // No implementation 

、サブクラスが抽象的ではないことが、これをオーバーライドする必要があります。

コール基底クラスを介した仮想メソッド:

Base* pBase = new Derived; 
pBase->fun(); 

メソッドは、基本クラスのインターフェースを介して呼び出されたが、それは派生クラスのメソッドになります。

関連する問題