《C++游戏编程入门》第10章 继承与多态:Blackjack
10.1 继承简介
从已有类派生新类,自动继承已有类的数据成员与成员函数。
可重用性的好处:
- 减少工作量。功能函数不必再次编写。
- 减少错误。
- 代码更加清晰。
10.simple_boss.cpp
#include <iostream>
using namespace std;
class Enemy
{
public:
int m_Damage;
Enemy();
void Attack() const;
};
Enemy::Enemy()
: m_Damage(10)
{
}
void Enemy::Attack() const
{
cout << "Attack inflicts " << m_Damage << " damage points!\n";
}
class Boss : public Enemy//基类派生,构造、析构、拷贝构造、拷贝赋值运算符未被继承
{
public:
int m_DamageMultiplier;
Boss();
void SpecialAttack() const;
};
Boss::Boss()
: m_DamageMultiplier(3)
{
}
void Boss::SpecialAttack() const
{
cout << "Special Attack inflicts " << (m_DamageMultiplier * m_Damage);
cout << " damage points!\n";
}
int main()
{
cout << "Creating an enemy.\n";
Enemy enemy1;
enemy1.Attack();
cout << "\nCreating a boss.\n";
Boss boss1;
boss1.Attack();
boss1.SpecialAttack();
return 0;
}
10.2 继承访问权的控制
public、protected、private只为派生类提供基类成员的必要的访问权。
- public:可被程序中所有代码访问。
- protected:本类和派生类访问。
- private:只能本类访问。
10.simple_boss2.cpp
#include <iostream>
using namespace std;
class Enemy
{
public:
Enemy();
void Attack() const;
protected:
int m_Damage;
};
Enemy::Enemy()
: m_Damage(10)
{
}
void Enemy::Attack() const
{
cout << "Attack inflicts " << m_Damage << " damage points!\n";
}
class Boss : public Enemy
{
public:
Boss();
void SpecialAttack() const;
private:
int m_DamageMultiplier;
};
Boss::Boss()
: m_DamageMultiplier(3)
{
}
void Boss::SpecialAttack() const
{
cout << "Special Attack inflicts " << (m_DamageMultiplier * m_Damage);
cout << " damage points!\n";
}
int main()
{
cout << "Creating an enemy.\n";
Enemy enemy1;
enemy1.Attack();
cout << "\nCreating a boss.\n";
Boss boss1;
boss1.Attack();
boss1.SpecialAttack();
return 0;
}
10.3 调用与重写基类成员函数
派生类中可重写基类的成员函数或者调用。
10.overriding_boss.cpp
#include <iostream>
using namespace std;
class Enemy
{
public:
Enemy(int damage = 10);
virtual void Taunt() const; // 声明虚基类成员函数
virtual void Attack() const; // 重写函数声明成虚函数
private:
int m_Damage;
};
Enemy::Enemy(int damage)
: m_Damage(damage)
{
}
void Enemy::Taunt() const
{
cout << "The enemy says he will fight you.\n";
}
void Enemy::Attack() const
{
cout << "Attack! Inflicts " << m_Damage << " damage points.";
}
class Boss : public Enemy
{
public:
Boss(int damage = 30);
virtual void Taunt() const; // virtual可省略
virtual void Attack() const override; // override建议增加
};
Boss::Boss(int damage)
: Enemy(damage) // 调用基类构造函数
{
cout << "damage in Boss(int damage): " << damage << endl;
}
void Boss::Taunt() const // override base class member function
{
cout << "The boss says he will end your pitiful existence.\n";
}
void Boss::Attack() const // override base class member function
{
Enemy::Attack(); // 调用基类成员函数
cout << " And laughs heartily at you.\n";
}
int main()