2017-05-29 100 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;。但是Code :: Blocks編譯器由於此= 0而顯示錯誤。沒有它,它會成功編譯。

而且我也沒有使用指針來調用派生類的方法。

+0

請編輯您的問題,在問題本身中提供[mcve] *。 –

+0

_I使用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(); 

的方法是通過基類的接口調用,但它將是派生類的方法。

相關問題