Простое наследование

Простым называется наследование, при котором производный класс имеет одного родителя. Для различных элементов класса существуют разные правила наследования. Рассмотрим наследование классов на примере.

Создадим производный от класса monster класс daemon, добавив полезную в некоторых случаях способность думать:

enum color {red, green, blue};// ------------- Класс monster -------------class monster{// ------------- Скрытые поля класса:int health, ammo;color skin;char *name;public: // ------------- Конструкторы: monster(int he = 100, int am = 10); monster(color sk); monster(char * nam); monster(monster &M); // ------------- Деструктор: ~monster() {delete [] name;} // ------------- Операции: monster& operator ++(){++health; return *this;} monster operator ++(int) {monster M(*this); health++; return M;} operator int(){return health;} bool operator >(monster &M) { if(health > M.get_health()) return true; return false; } monster& operator = (monster &M) { if (&M == this) return *this; if (name) delete [] name; if (M.name) { name = new char [strlen(M.name) + 1]; strcpy(name, M.name); } else name = 0; health = M.health; ammo = M.ammo; skin = M.skin; return *this; } // ------------- Методы доступа к полям: int get_health() const {return health;} int get_ammo() const {return ammo;} // ------------- Методы, изменяющие значения полей: void set_health(int he){ health = he;} void draw(int x, int y, int scale, int position);};// ------------- Реализация класса monster -------------monster::monster(int he, int am): health (he), ammo (am), skin (red), name (0){}monster::monster(monster &M){ if (M.name) { name = new char [strlen(M.name) + 1]; strcpy(name, M.name); } else name = 0; health = M.health; ammo = M.ammo; skin = M.skin;}monster::monster(color sk){switch (sk) { case red:health = 100; ammo = 10; skin = red; name = 0; break; case green:health = 100;ammo = 20;skin = green; name = 0; break; case blue: health = 100; ammo = 40; skin = blue; name = 0;break; }}monster::monster(char * nam){ name = new char [strlen(nam)+1]; strcpy(name, nam); health = 100; ammo = 10; skin = red;}void monster::draw(int x, int y, int scale, int position){ /*... Отрисовка monster */ }// ------------- Класс daemon -------------class daemon: public monster { int brain; public: // ------------- Конструкторы: daemon(int br = 10){brain = br;}; daemon(color sk): monster (sk) {brain = 10;} daemon(char * nam): monster (nam) {brain = 10;} daemon(daemon &M): monster (M) {brain = M.brain;} // ------------- Операции: daemon& operator = (daemon &M) { if (&M == this) return *this; brain = M.brain; monster::operator = (M); return *this; } // ------------- Методы, изменяющие значения полей: void draw(int x, int y, int scale, int position); void think();};// ------------- Реализация класса daemon -------------void daemon::draw(int x, int y, int scale, int position){ /*... Отрисовка daemon */ }void daemon:: think(){ /*... */ }

В классе daemon введено поле brain и метод think, определены собственные конструкторы и операция присваивания, а также переопределен метод отрисовки draw. Все поля класса monster, операции (кроме присваивания) и методы get_health, get_ammo и set_health наследуются в классе daemon, а деструктор формируется по умолчанию.

Рассмотрим правила наследования различных методов.

Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы.

  • Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию (то есть тот, который можно вызвать без параметров). Это использовано в первом из конструкторов класса daemon.
  • Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса.
  • В случае нескольких базовых классов их конструкторы вызываются в порядке объявления.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: