// -------------------------------------------------------------------- // Polymorphic Bad Guy // Demonstrates calling member functions dynamically // -------------------------------------------------------------------- #include using namespace std; // -------------------------------------------------------------------- // -------------------------------------------------------------------- class Enemy { public: Enemy(int damage = 10); virtual ~Enemy(); void virtual Attack() const; protected: int* mp_Damage; }; // -------------------------------------------------------------------- // -------------------------------------------------------------------- Enemy::Enemy(int damage) { mp_Damage = new int(damage); } // -------------------------------------------------------------------- // -------------------------------------------------------------------- Enemy::~Enemy() { cout << "In Enemy destructor, deleting mp_Damage.\n"; delete mp_Damage; mp_Damage = NULL; } // -------------------------------------------------------------------- // -------------------------------------------------------------------- void Enemy::Attack() const { cout << "An enemy attacks and inflicts " << *mp_Damage << " damage points."; } // -------------------------------------------------------------------- // -------------------------------------------------------------------- class Boss : public Enemy { public: Boss(int multiplier = 3); virtual ~Boss(); void virtual Attack() const; protected: int* mp_Multiplier; }; // -------------------------------------------------------------------- // -------------------------------------------------------------------- Boss::Boss(int multiplier) { mp_Multiplier = new int(multiplier); } // -------------------------------------------------------------------- // -------------------------------------------------------------------- Boss::~Boss() { cout << "In Boss destructor, deleting mp_Multiplier.\n"; delete mp_Multiplier; mp_Multiplier = NULL; } // -------------------------------------------------------------------- // -------------------------------------------------------------------- void Boss::Attack() const { cout << "A boss attacks and inflicts " << (*mp_Damage) * (*mp_Multiplier) << " damage points."; } // -------------------------------------------------------------------- // -------------------------------------------------------------------- // -------------------------------------------------------------------- // main - it all begins here // -------------------------------------------------------------------- int main() { cout << "Calling Attack() on Boss object through pointer to Enemy:\n"; Enemy* pBadGuy = new Boss(); pBadGuy->Attack(); cout << "\n\nDeleting pointer to Enemy:\n"; delete pBadGuy; pBadGuy = NULL; return 0; }