Skip to content

Module 03 Solutions

Download Module 03 Solutions

Base class with protected attributes for inheritance.

ClapTrap.hpp
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);
};

Inherits from ClapTrap with different values.

ScavTrap.hpp
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.cpp
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.


Virtual inheritance to solve the diamond problem.

ScavTrap.hpp
class ScavTrap : virtual public ClapTrap {
// virtual keyword prevents duplicate ClapTrap
};
FragTrap.hpp
class FragTrap : virtual public ClapTrap {
// virtual keyword prevents duplicate ClapTrap
};
DiamondTrap.hpp
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.cpp
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;
}