- •Закрытое наследование
- •Закрытое наследование
- •Композиция или закрытое наследование?
- •Пример
- •Защищенное наследование
- •Пример
- •Вложенные классы
- •Пример
- •Пример
- •Назначение PIMPL
- •Недостатки PIMPL
- •Реализация PIMPL
- •Пример (ComplexClass.h)
- •Основное преимущество
- •Оператор dynamic_cast
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 2 - ссылки
- •Пример 2 - ссылки
Вложенные классы
•ЯзыкC++ позволяетразместить объявлениеодногокласса(илидругого типаданных)внутриобъявления другого.
• Этополезно, когда вложенный тип данных, восновном, используется лишь внешним классом или совместно с ним. Пример-
итераторы стандартных контейнеров STL
Использованиевложенного класса
Изметодов внешнего класса– поимени вложенного класса.
◦Формальновложенныйклассэто тип, объявленныйвобластивидимостидругого класса.Поэтомувнейонпростодоступен.
Снаружи– припомощиуказанияименивнешнего
класса.
◦Доступко именамвложенныхклассовосуществляетсякаки клюбымдругимименамвнутриобластивидимостикласса:
ExternalClass::NestedClass
Пример
class External { public:
class Nested { public:
void Foo(){}
};
private:
void Bar() {
//из области видимости класса
//можем обращаться по имени
Nested nObj; nObj.Foo();
}
};
Пример
int main(int argc, char* argv[]) {
//Из внешней функции обращаемся, используя
//операцию расширения области видимости
External::Nested nObj2; nObj2.Foo();
return 0;
}
ИдиомаPIMPL
PIMPL - Pointer to private IMPLementation.
PIMPL - идиома программирования, заключающаяся в разделении интерфейса класса и его реализации сиспользованием отдельного закрытого класса или просто закрытогоуказателя накласс.
Шуточноеназвание "Чеширский кот": мы фактически имеем "улыбку без кота"- интерфейс находится в классе, а реализация отнего отделена.