|
Можно ли сдавать один и тот же тест несколько раз? |
С++. Классы. Механизмы наследования. Объектные типы
Вложенные классы
Язык С++ допускает использование вложенных классов - внутри тела одного класса содержится объявление других классов.
Например:
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
// недоступна через указатель на базовый
// класс АУказатели на члены класса или структуры не могут рассматриваться как обычные указатели и для них не выполняется стандартное преобразование типа.
Квалификация имен
Квалификация имен используется для однозначного понимания указываемого имени.
Для квалификации имени могут использоваться следующие операторы: :: (оператор принадлежности); . (оператор доступа к члену класса посредством имени); -> (оператор доступа к члену класса через указатель).