2011-06-16 55 views
2

Classes as parameter of function c++中的代碼複製到我的代碼中後,出現錯誤:note: because the following virtual functions are pure within 'TEA':和XTEA,但只有這兩個函數。其他功能,AES,BLOWFISH,CAMELLIA,RC4,RC5,RC6等都在工作。它只是這兩個錯誤的功能。我不明白爲什麼。從鏈路(略有修改)錯誤,因爲函數在類中是純虛擬的?

代碼:

class CryptoAlgorithm 
{ 
    public: 
     virtual std::string encrypt(std::string DATA) = 0; 
     virtual std::string decrypt(std::string DATA) = 0; 
     virtual void setkey(std::string KEY) = 0; 
}; 

和TEA setkey()

void setkey(std::string KEY, 
      unsigned int ROUNDS = 64, 
      uint32_t DELTA = 0x9e3779b9, uint32_t TOTAL = 0xc6ef3720) 

在其它類的功能的所有都是相同的。加密/解密只有std::string DATA作爲它們的參數。 void setkeystd::string KEY和其他可選參數。但是,像RC6這樣的功能,其setkey也有其他可選參數不會出錯。

任何原因爲什麼?

此外,所有類別的聲明旁邊都有: public CryptoAlgorithm

回答

1

=0;在C++中是純虛擬的,這意味着您必須在CryptoAlgorithm的子類中實現這些函數。

正如Als所說,你不能從純虛擬(抽象)類創建對象。

3

您不能創建抽象類的對象。您需要在派生類中創建純虛函數,以便能夠創建派生類的對象。

2

虛擬函數實現的定義必須與抽象類定義中的純虛函數具有相同的原型,否則編譯器會將它們視爲不同的函數(它們會變成重載),您還需要實現每個純虛函數因爲這個類不是抽象的(當然它也不能定義它自己的純虛函數)。修復它的選項是讓你的實現類實現setKey只有一個字符串參數(以匹配虛擬原型),然後有一個單獨的函數用於重載(然而這可能導致從默認參數的ambiguos調用)。

+0

'encrypt'只有一個參數。還有,如果RC6.setkey()'有多個可選參數,它是如何通過的呢? – calccrypto 2011-06-16 16:57:58

+0

@cal:我只能告訴你,在實現的類的定義下,儘管我打賭它的原因有些類有'setkey'的多個版本,其中一個編譯器可以匹配純虛擬函數,或編譯器停止在相同的錯誤的倍數 – Necrolis 2011-06-16 17:12:12

+0

沒有。每個類只有一個'setkey()' – calccrypto 2011-06-16 20:59:55