c++でStrategyパターンってこんな感じ?

とある面接で「デザインパターンちゃんと理解して無いよね」と指摘されたので勉強中。得意な言語だと意味が無いとなぜか思い込んでしまいc++で勉強中。
ちなみにさくらで書いているのですが、正しいダイジェストが取れません。何かバグってるのでしょうけどデザインパターンの勉強と割り切って見ない振りをしています。

#include <iostream>
#include <string>
#include <map>
#include "openssl/md5.h"
#include "openssl/sha.h"

typedef unsigned int u_int;
        
using std::cout;
using std::cerr;
using std::endl;
using std::string;

struct HashPtn
{       
    virtual string get_hash( string s ) = 0;
};

struct MD5_hash : public HashPtn 
{       
    virtual string get_hash ( string s )
    {
        unsigned char digest[MD5_DIGEST_LENGTH];
        MD5_CTX ctx;
        MD5_Init(&ctx);
        MD5_Update(&ctx, reinterpret_cast<const unsigned char *>(s.c_str()), s.length());
        MD5_Final(digest, &ctx);

        string ret = reinterpret_cast<char *>(digest);
        return ret;
    }
};

struct SHA1_hash : public HashPtn 
{
    virtual string get_hash ( string s )
    {
        unsigned char digest[SHA_DIGEST_LENGTH];
        SHA_CTX ctx;

        SHA1_Init(&ctx);
        SHA1_Update(&ctx, reinterpret_cast<const unsigned char *>(s.c_str()), s.length());
        SHA1_Final(digest, &ctx);

        string ret = reinterpret_cast<char *>(digest);
        return ret;
    }
};

struct Hash
{       
    HashPtn * m_strategy ;
    Hash( HashPtn * in_strategy )
    {
        m_strategy = in_strategy ;
    }
        
    string get_hash_( string s )
    {   
        return m_strategy->get_hash( s );
    }
} ;

int main()
{
    MD5_hash md5;
    Hash h( &md5 );
    cerr << h.get_hash_( "hoge" ) << endl;
    return 0;
}

g++ -g -O2 -Wall -ggdb -pg  -I. my_hash.cc -o my_hash -lm -lstdc++ -lcrypto  -lssl