MyTetra Share
Делитесь знаниями!
Наследование классов
Время создания: 25.12.2016 19:24
Текстовые метки: cpp, c++
Раздел: Computer - Programming - C++

Наследование классов позволяет создавать производные классы (классы наследники), взяв за основу все методы и элементы базового класса (класса родителя).


#include <iostream>

using namespace std;

 

class FirstClass    // базовый класс

{

protected:          // спецификатор доступа к элементу value

    int value;

public:

    FirstClass()

    {

        value = 0;

    }

 

    FirstClass( int input )

    {

        value = input;

    }

 

    void show_value()

    {

        cout << value << endl;

    }

};

 

class SecondClass : public FirstClass   // производный класс

{

public:

    SecondClass() : FirstClass ()   // конструктор класса SecondClass вызывает конструктор класса FirstClass

    {}

 

    SecondClass(int inputS) : FirstClass (inputS)   // inputS передается в конструктор с параметром класса FirstClass

    {}

 

    void ValueSqr () // возводит value в квадрат. Без спецификатора доступа protected эта функция не могла бы изменить значение value

    {

        value *= value;    

    }  

};

 

int main()

{

    setlocale(LC_ALL, "rus");

 

    FirstClass F_object(3);     // объект базового класса

    cout << "value F_object = ";

    F_object.show_value();

 

    SecondClass S_object(4);    // объект производного класса

    cout << "value S_object = ";

    S_object.show_value();  // вызов метода базового класса

 

    S_object.ValueSqr();        // возводим value в квадрат

    cout << "квадрат value S_object = ";

    S_object.show_value();

 

    //F_object.ValueSqr();      // базовый класс не имеет доступа к методам производного класса

 

    cout << endl;

    return 0;

}


Спецификатор доступа protected. отличается от private тем, что разрешает доступ к элементам базового класса из производных классов. Если бы элемент value находился в поле private, то доступ к нему был бы закрыт и мы бы не могли изменить его значение через объект класса SecondClass, используя функцию ValueSqr()



private

protected

public

Доступ из тела класса

 открыт

  открыт

  открыт

Доступ из производных классов

 закрыт

  открыт

  открыт

Доступ из внешних функций и классов

 закрыт

 закрыт

  открыт


Синтаксис наследования:

class Имя_Производного_Класса : спецификатор доступа Имя_Базового_Класса {};


Важной особенностью производного класса, является то, что хоть он и может использовать все методы и элементы полей protected и public базового класса, но он не может обратиться к конструктору с параметрами. Если конструкторы в производном классе не определены, при создании объекта сработает конструктор без аргументов базового класса.

Для использования родительского конструктора при определении конструктора производного класса после его имени следует поставить оператор : и  имя конструктора базового класса, который необходимо вызвать, при создании объекта производного класса — SecondClass() : FirstClass (){}. Тело конструктора оставляем пустым т.к. всю работу проделает конструктор базового класса.

В случае конструктора с параметром, этот параметр мы передаем в конструктор с параметром базового класса SecondClass(int inputS) : FirstClass (inputS){}.


Важная особенность — производный класс имеет доступ к базовому классу, а базовый класс, даже «не знает» о существовании производного и не может пользоваться его кодом.


Для вызова перегруженным методов родителя необходимо явно указывать область видимости (::), например:

void show_value()

{

    if(value != 0)

        FirstClass :: show_value();

}


P.S:

class SecondClass : public FirstClass
почему здесь записано public, а не private или protected?


Члены базового класса внутри производного будут иметь спецификатор доступа не меньше, чем указан при наследовании. Т.е. если написать public, то private станет недоступен, protected останется protected, а public - public.

Если написать protected, то public базового класса уйдет в protected наследуемого и не будет доступен извне.

Если написать private, то protected и public базового класса в наследуемом станут private, т.е. будут недоступны извне и при наследовании от этого наследованного класса.

 
MyTetra Share v.0.53
Яндекс индекс цитирования