Currency in C++

Translate this C++ program into Java while adding Dirham_marocain, Dollar, and Bitcoin as subclass of Crypto_currency.

Java solution Currency.Java.zip 

// '.h' file:
class Currency;
class Obsolete_currency {
public:
    static const Currency& Default_substitute;
    const Currency& substitute() const;
    bool still_active_() const;
    virtual std::tm substitution_date() const = 0;
};
class Currency {
public:
    const std::string _common_symbol; // $ <- exemple du dollar américain
    const int _iso_code; // 840 <- exemple du dollar américain
    const std::string _iso_symbol; // USD <- exemple du dollar américain
protected:
    Currency(std::string, int, std::string);
public:
    double rate(const Currency& currency) const;
    virtual double to_dollar_rate() const = 0;
    double convert_to_dollar(const double amount) const;
    virtual double to_euro_rate() const = 0;
    double convert_to_euro(const double amount) const;
};
class Euro : public Currency {
public:
    Euro();
    double to_dollar_rate() const;
    double to_euro_rate() const;
};
class Lats : public Currency, public Obsolete_currency { /** Monnaie de la Lettonie remplacée par l'Euro le 1er janvier 2014 **/
private:
    static const std::tm _Substitution_date;
public:
    Lats();
    double to_dollar_rate() const;
    double to_euro_rate() const;
    std::tm substitution_date() const;
};

// '.cpp' file:
const Currency& Obsolete_currency::Default_substitute = Euro();
const Currency& Obsolete_currency::substitute() const {
    return Default_substitute;
}
bool Obsolete_currency::still_active_() const {
    return false;
}
Currency::Currency(std::string common_symbol, int iso_code, std::string iso_symbol) :
_common_symbol(common_symbol),
_iso_code(iso_code),
_iso_symbol(iso_symbol) {}
double Currency::rate(const Currency& currency) const {
    return 1. / currency.to_euro_rate();
}
double Currency::convert_to_dollar(const double amount) const {
    return amount * to_dollar_rate();
}
double Currency::convert_to_euro(const double amount) const {
    return amount * to_euro_rate();
}
Euro::Euro() : Currency("€", 978, "EUR") {}
double Euro::to_dollar_rate() const {
    return 1.1; // Taux pris le 17 sept. 2019
}
double Euro::to_euro_rate() const {
    return 1.;
}
const std::tm Lats::_Substitution_date = tm{.tm_mday = 1, .tm_mon = 0, .tm_year = 114};
Lats::Lats() : Currency("Ls", 428, "LVL") {}
double Lats::to_dollar_rate() const {
    const Currency& substitute = this->substitute();
    return rate(substitute) * substitute.to_dollar_rate();
}
double Lats::to_euro_rate() const {
    return 1. / 0.702804; // Jan. 1, 2014 exchange rate
}
std::tm Lats::substitution_date() const {
    return _Substitution_date;
}
int main() {
    Lats lats;
    std::cout << lats.convert_to_euro(100) << '\n';
    std::cout << lats.convert_to_dollar(100) << '\n';
}