Ошибка, потому что функция является чисто виртуальной в классе? - PullRequest
3 голосов
/ 16 июня 2011

После копирования кода из Классы в качестве параметра функции 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 setkey имеет std::string KEY и другие необязательные аргументы.Однако такие функции, как RC6, чьи setkey также имеют другие необязательные аргументы, не вызывают ошибок.

Любая причина, почему?

Кроме того, все классы имеют : public CryptoAlgorithm рядом с их объявлениями.

Ответы [ 3 ]

4 голосов
/ 16 июня 2011

Определения реализации виртуальной функции должны иметь те же прототипы, что и ваши чисто виртуальные функции в определении абстрактного класса, иначе компилятор обрабатывает их как разные функции (они становятся перегрузками), вам также необходимо реализовать каждую чисто виртуальную функцию для класс не должен быть абстрактным (конечно, он не может определять свои собственные чисто виртуальные функции). Чтобы исправить это, нужно, чтобы ваши классы реализации реализовали setKey только с одним строковым аргументом (для соответствия виртуальному прото), а затем имели отдельную функцию для перегрузок (это может привести к вызовам неоднозначности из параметры по умолчанию однако).

3 голосов
/ 16 июня 2011

Вы не можете создавать объекты абстрактных классов. Вам нужно переопределить чистые виртуальные функции в вашем производном классе, чтобы иметь возможность создавать объекты производного класса.

1 голос
/ 16 июня 2011

=0; является чисто виртуальным в C ++, что означает, что вы должны реализовать эти функции в дочерних классах CryptoAlgorithm.

И, как сказал Алс, вы не можете создавать объекты из чисто виртуальных (абстрактных) классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...