Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement