- •Закрытое наследование
- •Закрытое наследование
- •Композиция или закрытое наследование?
- •Пример
- •Защищенное наследование
- •Пример
- •Вложенные классы
- •Пример
- •Пример
- •Назначение PIMPL
- •Недостатки PIMPL
- •Реализация PIMPL
- •Пример (ComplexClass.h)
- •Основное преимущество
- •Оператор dynamic_cast
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 2 - ссылки
- •Пример 2 - ссылки
Назначение PIMPL
Улучшение повторного использования
Сокрытиеплатформо-зависимой реализации отпользователя
Улучшение бинарной совместимости библиотеки
Сокращение количества экспортируемых символов и повышение скорости загрузки
Значительное снижение времени компиляции
Недостатки PIMPL
Вконструкторахидеструкторах классов, использующих идиому увеличивается количество инструкций по выделению и освобождению памяти
Всеметоды, обращающиеся кзакрытой реализации, вынесенной в отдельный класс, содержат+1 инструкцию вызова метода.
Сучетомуказанных вышенедостатков, следуетизбегать применения PIMPL для классов,объекты которых создаются часто и/иливбольших количествах.
Реализация PIMPL
Чтоможно скрыть с применением идиомы:
◦толькосокрытые(private иprotected) от внешнего использованияатрибуты
◦всесокрытыеатрибутыиметоды(нонеполучится сvirtual инелогичносprotected)
◦всёсодержимое классатогдалишаемся возможностинаследования
Пример (ComplexClass.h)
// ComplexClass.h class CComplexClass{ public:
CComplexClass(); void Foo(); ~CComplexClass();
private:
// класс Impl хранит все закрытые //данные и методы класса CComplexClass class Impl; // Упреждающее объявление
Impl * m_pImpl; };
Пример(ComplexClass.cpp)
// ComplexClass.cpp
class CComplexClass::Impl { public:
void Foo() { //…
}
private: // …
};
Пример(ComplexClass.cpp)
CComplexClass::CComplexClass() :m_pImpl(new Impl())
{
}
CComplexClass::~CComplexClass() { delete m_pImpl;
}
void CComplexClass::Foo(){ m_pImpl->Foo();
}