#include #include #define unitid size_t struct Unit { explicit Unit(unitid id, size_t hp, std::string name) : id(id), hp(hp), name(name) {}; virtual unitid getId() final { return id; } virtual size_t getHp() final { return hp; } virtual std::string getName() final { return name; } private: unitid id; size_t hp; std::string name; }; // struct Elf : virtual Unit { explicit Elf(unitid id) : Unit(id, 150, "Эльф") {}; }; struct Archer : virtual Unit { explicit Archer(unitid id) : Unit(id, 100, "Лучник") {}; }; // Не смотря на то, что Unit не является 'отцом' // А является предком второго уровня, тем не менее // мы должны вызывать конструктор Unit и передать туда параметры // Таким образом мы убираем неоднозначность struct ElfArcher : Elf, Archer { explicit ElfArcher(unitid id) : Unit(id, 120, "Эльф-Лучник"), Elf(id), Archer(id) {}; }; int main() { Elf elf(0); std::cout << elf.getName() << " " << elf.getHp() << std::endl; // Вывод: Эльф 150 Archer archer(1); std::cout << archer.getName() << " " << archer.getHp() << std::endl; // Вывод: Лучник 100 ElfArcher elfArcher(1); std::cout << elfArcher.getName() << " " << elfArcher.getHp() << std::endl; // Вывод: Эльф-Лучник 120 return 0; }