#include <iostream>
#include <string>
#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;
}