Вы можете использовать абстрактные классы:
class CryptoAlgorithm
{
public:
// whatever functions all the algorithms do
virtual vector<char> Encrypt(vector<char>)=0;
virtual vector<char> Decrypt(vector<char>)=0;
virtual void SetKey(vector<char>)=0;
// etc
}
// user algorithm
class DES : public CryptoAlgorithm
{
// implements the Encrypt, Decrypt, SetKey etc
}
// your function
class mode{
public:
mode(CryptoAlgorithm *algo) // << gets a pointer to an instance of a algo-specific class
//derived from the abstract interface
: _algo(algo) {}; // <<- make a "Set" method to be able to check for null or
// throw exceptions, etc
private:
CryptoAlgorithm *_algo;
}
// in your code
...
_algo->Encrypt(data);
...
//
Таким образом, когда вы вызываете _algo->Encrypt
- вы не знаете и не заботитесь о том, какой конкретный алгоритм вы используете, просто о том, что онреализует интерфейс, который должны реализовывать все криптоалгоритмы.