Module 03 Solutions
Exercise 00: ClapTrap
Section titled “Exercise 00: ClapTrap”Base class with protected attributes for inheritance.
class ClapTrap {protected: std::string _name; int _hitPoints; // 10 int _energyPoints; // 10 int _attackDamage; // 0
public: ClapTrap(std::string name); ClapTrap(const ClapTrap& other); ClapTrap& operator=(const ClapTrap& other); ~ClapTrap();
void attack(const std::string& target); void takeDamage(unsigned int amount); void beRepaired(unsigned int amount);};Exercise 01: ScavTrap
Section titled “Exercise 01: ScavTrap”Inherits from ClapTrap with different values.
class ScavTrap : public ClapTrap {public: ScavTrap(std::string name); ScavTrap(const ScavTrap& other); ScavTrap& operator=(const ScavTrap& other); ~ScavTrap();
void attack(const std::string& target); // Override void guardGate(); // New ability};ScavTrap::ScavTrap(std::string name) : ClapTrap(name) { std::cout << "ScavTrap " << _name << " constructed" << std::endl; _hitPoints = 100; _energyPoints = 50; _attackDamage = 20;}Key Point: Call base constructor in initialization list, then override values.
Exercise 03: DiamondTrap
Section titled “Exercise 03: DiamondTrap”Virtual inheritance to solve the diamond problem.
class ScavTrap : virtual public ClapTrap { // virtual keyword prevents duplicate ClapTrap};class FragTrap : virtual public ClapTrap { // virtual keyword prevents duplicate ClapTrap};class DiamondTrap : public ScavTrap, public FragTrap {private: std::string _name; // Own name (shadows ClapTrap::_name)
public: DiamondTrap(std::string name); ~DiamondTrap();
using ScavTrap::attack; // Use ScavTrap's attack void whoAmI();};DiamondTrap::DiamondTrap(std::string name) : ClapTrap(name + "_clap_name"), // Initialize virtual base ScavTrap(name), FragTrap(name), _name(name){ _hitPoints = FragTrap::_hitPoints; // 100 _energyPoints = ScavTrap::_energyPoints; // 50 _attackDamage = FragTrap::_attackDamage; // 30}
void DiamondTrap::whoAmI() { std::cout << "I am " << _name << std::endl; std::cout << "My ClapTrap name is " << ClapTrap::_name << std::endl;}