
Исправления:
Добавлена функция system(“pause”) для просмотра результата в консоли.
Добавлено определение пространства имён using namespace std, для использования краткого обращения к функциям cout и cin.
Исправлено описание заголовка <iostream>.
Исправлены различные ошибки распознавания текста.
Для отображения корректного русских символов в консоли была добавлена функция setlocale( LC_ALL, "Russian" ).
Листинг №4:
#include <iostream>
using namespace std;
struct Base {
enum ClassType {BASE, SUBCLASS};
virtual ClassType isA() {return BASE;}
};
struct SubClass : public Base {
virtual ClassType isA() {return SUBCLASS;}
};
void print(Base& obj) {
if (obj.isA()==Base::BASE)
cout << "Это объект базового класса\n";
else
if(obj.isA()==Base::SUBCLASS)
cout<< "Это объект подкласса\n";
else
cout<< "Это неизвестный тип объекта\n";
}
void fn(Base& obj) {
print(obj);
}
void main() {
setlocale(LC_ALL,"Russian");
Base aBaseClass;
SubClass aSubClass; fn(aBaseClass); fn(aSubClass);
system("pause");
}
Контрольные вопросы
Что такое производный класс, в чем выражается механизм наследования?
Если класс находится в связи наследования, то говорят, что он наследует и называется производным классом, а класс более высокого уровня называется базовым. Классы, связанные наследованием, образуют цепочку наследования (или иерархию наследования). Любой класс, включенный в середину этой цепочки, является производным от класса, стоящего на ступеньку выше, и в свою очередь является базовым для класса, стоящего на ступеньку ниже в иерархии наследования. Производные классы еще называют дочерними, а базовые - родительскими.
При наследовании происходит слияние кодов базового и производного классов и все сервисы базового класса доступны в производном классе или даже в клиенте производного класса.
Какие синтаксические конструкции в языке С++ используются для описания производных классов?
Производный класс строится на базе уже существующего с помощью конструкции следующего вида:
class Base {
// Элементы класса
};
class Derived: [модификатор доступа] Base {
// Элементы класса
};
При определении производного класса за его именем, следуют разделитель - двоеточие (:), затем необязательный модификатор доступа и имя базового класса. Модификатор доступа определяет область видимости наследуемых компонентов для производного класса и его возможных потомков.
Каковы особенности доступа к компонентам производных классов?
В какой последовательности вызываются конструкторы для производных классов?
Конструктор должен вызываться при объявлении объекта, и если у этого конструктора есть параметры, их необходимо предоставить.
Параметры конструктора базового класса указываются в определении конструктора производного класса. Вызов конструктора базового класса следует непосредственно после имени конструктора производного класса, перед открывающей фигурной скобкой.
Что такое объемлющий класс?
Производный класс использует компоненты своего базового класса, в то время как объемлющий класс просто предоставляет место компонентам другого класса.
Как реализуется механизм полиморфизма для производных классов?
Использование одного и того же вызова для ссылки к разным правилам в зависимости от типа, передаваемого при вызове объекта, называется полиморфизмом. Для поддержания полиморфизма язык программирования должен иметь возможность во время выполнения принимать решение о том, какая именно компонентная функция с этим именем должна быть вызвана. Этот процесс носит название позднего связывания.
Вместе с тем, позднее связывание замедляет выполнение программы. При вызове полиморфной функции программа обязана выполнить ряд лишних обращений к памяти.
Где и когда используется правило isA() ?
isA(). Это виртуальное правило возвращает константу, которая является уникальной для каждого типа подкласса..