2011-06-16 53 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