Advertisement
Gistrec

Множественное наследование (конструктор)

Feb 27th, 2018
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. #define unitid size_t
  5.  
  6. struct Unit {
  7.     explicit Unit(unitid id, size_t hp, std::string name)
  8.             : id(id), hp(hp), name(name) {};
  9.  
  10.     virtual unitid getId() final { return id; }
  11.     virtual size_t getHp() final { return hp; }
  12.     virtual std::string getName() final { return name; }
  13. private:
  14.     unitid id;
  15.     size_t hp;
  16.     std::string name;
  17. };
  18.  
  19. //
  20. struct Elf : virtual Unit {
  21.     explicit Elf(unitid id)
  22.             : Unit(id, 150, "Эльф") {};
  23. };
  24.  
  25. struct Archer : virtual Unit {
  26.     explicit Archer(unitid id)
  27.             : Unit(id, 100, "Лучник") {};
  28. };
  29.  
  30. // Не смотря на то, что Unit не является 'отцом'
  31. // А является предком второго уровня, тем не менее
  32. // мы должны вызывать конструктор Unit и передать туда параметры
  33. // Таким образом мы убираем неоднозначность
  34. struct ElfArcher : Elf, Archer {
  35.     explicit ElfArcher(unitid id)
  36.             : Unit(id, 120, "Эльф-Лучник"), Elf(id), Archer(id) {};
  37. };
  38.  
  39. int main() {
  40.     Elf elf(0);
  41.     std::cout << elf.getName() << " " << elf.getHp() << std::endl;
  42.     // Вывод: Эльф 150
  43.  
  44.     Archer archer(1);
  45.     std::cout << archer.getName() << " " << archer.getHp() << std::endl;
  46.     // Вывод: Лучник 100
  47.  
  48.     ElfArcher elfArcher(1);
  49.     std::cout << elfArcher.getName() << " " << elfArcher.getHp() << std::endl;
  50.     // Вывод: Эльф-Лучник 120
  51.  
  52.     return 0;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement