#include <iostream>
class Creature
{
public:
Creature(const std::string& name) : name(name) {}
virtual ~Creature() = default;
virtual void printInfo() const
{
std::cout << name;
};
std::string name;
};
template <typename T>
class VampiredCreature : T
{
public:
VampiredCreature(const T& t, float sunlightSensitivity)
: T(t),
sunlightSensitivity(sunlightSensitivity) {}
void printInfo() const override
{
T::printInfo();
std::cout << " vampired: " << sunlightSensitivity;
};
float sunlightSensitivity = 0.f;
};
template <typename T>
class WereWolfCreature : T
{
public:
WereWolfCreature(const T& t, int wolfHours) : T(t), wolfHours(wolfHours) {}
void printInfo() const override
{
T::printInfo();
std::cout << " wereWolf: " << wolfHours;
}
int wolfHours;
};
using Vampire = VampiredCreature<Creature>;
using Werewolf = WereWolfCreature<Creature>;
using VampireWerewolf = WereWolfCreature<Vampire>;
int main()
{
Creature bob("Bob");
Vampire dracula({"Dracula"}, 0.42f);
Werewolf wolf({"Mi-Wolf"}, 50);
VampireWerewolf vampireWereWolf({{"Wolf/Vampire"}, 0.51f}, 36);
bob.printInfo();
std::cout << "\n-----------\n";
dracula.printInfo();
std::cout << "\n-----------\n";
wolf.printInfo();
std::cout << "\n-----------\n";
vampireWereWolf.printInfo();
std::cout << "\n-----------\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQ3JlYXR1cmUKewpwdWJsaWM6CiAgICBDcmVhdHVyZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOiBuYW1lKG5hbWUpIHt9CgogICAgdmlydHVhbCB+Q3JlYXR1cmUoKSA9IGRlZmF1bHQ7CiAgICB2aXJ0dWFsIHZvaWQgcHJpbnRJbmZvKCkgY29uc3QKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgbmFtZTsKICAgIH07CgogICAgc3RkOjpzdHJpbmcgbmFtZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBWYW1waXJlZENyZWF0dXJlIDogVAp7CnB1YmxpYzoKICAgIFZhbXBpcmVkQ3JlYXR1cmUoY29uc3QgVCYgdCwgZmxvYXQgc3VubGlnaHRTZW5zaXRpdml0eSkKICAgIDogVCh0KSwKICAgICAgc3VubGlnaHRTZW5zaXRpdml0eShzdW5saWdodFNlbnNpdGl2aXR5KSB7fQoKICAgIHZvaWQgcHJpbnRJbmZvKCkgY29uc3Qgb3ZlcnJpZGUKICAgIHsKICAgICAgICBUOjpwcmludEluZm8oKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiB2YW1waXJlZDogIiA8PCBzdW5saWdodFNlbnNpdGl2aXR5OwogICAgfTsKICAgIGZsb2F0IHN1bmxpZ2h0U2Vuc2l0aXZpdHkgPSAwLmY7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgV2VyZVdvbGZDcmVhdHVyZSA6IFQKewpwdWJsaWM6CiAgICBXZXJlV29sZkNyZWF0dXJlKGNvbnN0IFQmIHQsIGludCB3b2xmSG91cnMpIDogVCh0KSwgd29sZkhvdXJzKHdvbGZIb3Vycykge30KCiAgICB2b2lkIHByaW50SW5mbygpIGNvbnN0IG92ZXJyaWRlCiAgICB7CiAgICAgICAgVDo6cHJpbnRJbmZvKCk7CiAgICAgICAgCiAgICAgICAgc3RkOjpjb3V0IDw8ICIgd2VyZVdvbGY6ICIgPDwgd29sZkhvdXJzOwogICAgfQogICAgaW50IHdvbGZIb3VyczsKfTsKCnVzaW5nIFZhbXBpcmUgPSBWYW1waXJlZENyZWF0dXJlPENyZWF0dXJlPjsKdXNpbmcgV2VyZXdvbGYgPSBXZXJlV29sZkNyZWF0dXJlPENyZWF0dXJlPjsKdXNpbmcgVmFtcGlyZVdlcmV3b2xmID0gV2VyZVdvbGZDcmVhdHVyZTxWYW1waXJlPjsKCmludCBtYWluKCkKewogICAgQ3JlYXR1cmUgYm9iKCJCb2IiKTsKICAgIFZhbXBpcmUgZHJhY3VsYSh7IkRyYWN1bGEifSwgMC40MmYpOwogICAgV2VyZXdvbGYgd29sZih7Ik1pLVdvbGYifSwgNTApOwogICAgVmFtcGlyZVdlcmV3b2xmIHZhbXBpcmVXZXJlV29sZih7eyJXb2xmL1ZhbXBpcmUifSwgMC41MWZ9LCAzNik7CgogICAgYm9iLnByaW50SW5mbygpOwogICAgc3RkOjpjb3V0IDw8ICJcbi0tLS0tLS0tLS0tXG4iOwogICAgZHJhY3VsYS5wcmludEluZm8oKTsKICAgIHN0ZDo6Y291dCA8PCAiXG4tLS0tLS0tLS0tLVxuIjsKICAgIHdvbGYucHJpbnRJbmZvKCk7CiAgICBzdGQ6OmNvdXQgPDwgIlxuLS0tLS0tLS0tLS1cbiI7CiAgICB2YW1waXJlV2VyZVdvbGYucHJpbnRJbmZvKCk7CiAgICBzdGQ6OmNvdXQgPDwgIlxuLS0tLS0tLS0tLS1cbiI7Cn0K