Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы - Программирование (2я часть).docx
Скачиваний:
6
Добавлен:
26.09.2019
Размер:
36.37 Кб
Скачать

Ненаследуемые методы и операции.

Если поля и методы базового класса имеют модификатор private то они не будут автоматически видны в наследнике. Для того чтобы работать с ними потребуется описать их специальным образом. Например если в базовом классе base_class были описаны поле value и метод checkValue с модификатором private, то в наследнике надо будет описать как:

base_class::value;

base_class:checkValue() { … };

В остальных случаях наследуются все методы, кроме конструкторов деструкторов и операций присваивания.

Инициализация объекта порожденного класса.

Так как конструкторы не наследуются, то необходимо в наследниках описывать их самостоятельно. При этом есть возможно автоматически определять вызов базового конструктора. Например для класса children_class унаследованного от base_class можно описать конструктор вызывающий конструктор базового класса так:

children_class() : base_class( “какие-нибудь параметры”) { … };

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

Перегрузка функций.

Под перегрузкой функций (методов) понимается описание их с одинаковыми именами но различными параметрами. Параметры должны обязательно отличаться, чтобы компилятор мог определить какая именно функция (метод) вызывается. Так как конструктор это тоже метод, то так же можно создавать и перегруженные конструкторы для различной логики создания объекта класса.

Виртуальные методы.

Под виртуальными методами понимаются специальные методы классов (не статические), которые могут переопределяться в наследниках с помощью специального слова virtual. Хитрость заключается в том, что базовый класс например может внутри своих методов вызывать виртуальный метод, не зная переопределен ли он в наследниках. Но если мы переопределим его в наследнике, то при операциях над объектом будет вызываться именно переопредеенный. Виртуальный метод (виртуальная функция) – в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.

Виртуальные методы – один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника.

Пример:

class Ancestor

{

public:

virtual void function1 () { cout << "Ancestor::function1()" << endl; } // вывод на экран текста.

void function2 () { cout << "Ancestor::function2()" << endl; } // вывод на экран текста.

};

class Descendant : public Ancestor

{

public:

virtual void function1 () { cout << "Descendant::function1()" << endl; } // вывод на экран текста.

void function2 () { cout << "Descendant::function2()" << endl; } // вывод на экран текста.

};

Descendant* pointer = new Descendant ();

Ancestor* pointer_copy = pointer; // В указателе на родительский класс можно хранить ссылку на класс-наследник.

pointer->function1 (); // вызовется метод класса-наследника, так как он виртуальный.

pointer->function2 (); // вызовется метод класса-наследника, так как указатель имеет тип наследника.

pointer_copy->function1 (); // вызовется метод класса-наследника, так как он виртуальный.

pointer_copy->function2 (); // вызовется метод базового класса, так как указатель имеет тип базового класса.