Simple bank-account application using composition
Don’t write using namespace std;.

You can, however, in a CPP file (not H file) or inside a function put individual using std::string; etc.  (See SF.7.)



Balance(double amount, std::string currency)
    : d_amount(amount), d_currency(currency) {}

std::string d_currency;


You are taking the currency parameter by value, and then copying it to the member, then you don’t need the first copy anymore.  I think you were trying to use the “sink” parameter idiom?

 : d_amount{amount}, d_currency{std::move(currency)} {}


You forgot the move!  Also, you were using old syntax for the initializers: use uniform initialization style now (since C++11).  (Later) I see you did move in another class, so that was your intent here I think.

I see you are using initializers, which is good.  Likewise, using exactly one of virtual/override/final on a virtual function, and using unique_ptr.



void print_balance() { std::cout &lt;&lt; d_balance &lt;&lt; ":" &lt;&lt; *d_interest_rate; }


That’s exactly the same for CurrentAccount and SavingsAccount.  I thought at first you were overriding a virtual function with no need, but looking closer I see that these classes are not related, and yet they are identical!  I don’t want to do a diff to find out if there is a few chars different somewhere, so that is a concern for understandibility.  

Likewise, AccountFactory is duplicating the same code for both creation functions.  What is the deal here?  If you need “strong types”, just add a template parameter.  Don’t duplicate the entire code for the class manually!



Why is InterestRate a polymorphic interface?  Is what’s shown here just as example, or is there really nothing more to it than different values of a field?  Because in that case, you should just use a value.  This is especially odd since you always use the same Interest Rate class with a corresponding Account class — there is no need to make it polymorphic at all, even if they were really different.