Можно ли сдавать один и тот же тест несколько раз? |
С++. Классы. Механизмы наследования. Объектные типы
Вложенные классы
Язык С++ допускает использование вложенных классов - внутри тела одного класса содержится объявление других классов.
Например:
class A { public: A(void); ~A(void); class B { // Вложенный класс B(void) {}; ~B(void) {}; char sStr2[3]; }; };
Объектные типы
Тип данных всегда определяет размер памяти, которая будет выделена под переменную данного типа при ее создании.
При объявлении переменной объектного типа (типа класса) создаются переменные члены класса и вызывается конструктор класса. Производные типы на основе классов позволяют получать доступ к членам класса.
Переменная, объявленная как указатель на класс, применяется для доступа к методам и переменным членам класса. В следующей таблице приведен синтаксис, используемый при работе с указателями на члены класса.
Hапример:
#include <iostream.h> class A // Объявление класса A { public: int j1; A(void); ~A(void);}; void main() { int A::*pToj = &A::j1; // Объявление производного типа pToj // как указателя на член класса j1 A jA; // Объявление переменной объектного типа A A *pjA = & jA; // Объявление указателя на эту // переменную (объект) int j; jA.*pToj = 123; // Присваивание значения переменной // jA::j1, используя * j = pjA ->*pToj; // Получение значения, используя ->* std::cout << j << "\n"; }
Преобразование объектных типов
Указатель на класс может быть преобразован к указателю на базовый класс в двух случаях:
- если базовый класс является доступным и преобразование однозначно;
- если указано явное преобразование типа указателя.
Например:
class A // А - базовый класс {public: int a1; int Fa(); }; class B : public A // В - производный класс {public: int b1; int Fb(); }; B bObj; // Объект типа B A *pA = &bObj; // Преобразование типа ограничивает // доступ к членам класса B и // разрешает доступ только к членам // базового класса B *pB = &bObj; // Нет преобразования типа и // следовательно разрешен доступ как // к членам класса B, // так и к членам класса А. pA-> Fa (); // Правильно: вызов функции члена класса A. pB-> Fa (); // Правильно: вызов функции, //наследуемой от класса A // Вызов pA-> Fb (); ошибочен: функция Fb // недоступна через указатель на базовый // класс А
Указатели на члены класса или структуры не могут рассматриваться как обычные указатели и для них не выполняется стандартное преобразование типа.
Квалификация имен
Квалификация имен используется для однозначного понимания указываемого имени.
Для квалификации имени могут использоваться следующие операторы: :: (оператор принадлежности); . (оператор доступа к члену класса посредством имени); -> (оператор доступа к члену класса через указатель).