Gistrec icon

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

Gistrec | PRO | 02/27/18 04:44:58 PM UTC | 0 ⭐ | 831 👁️ | Never ⏰ | []
C++ |

1.57 KB

|

None

|

0 👍

/

0 👎

#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;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎