Содержание
- 2. Проблема неоднозначности class BorrowableItem { // нечто, что можно позаимствовать из библиотеки public: void checkOut(); ...
- 3. Проблема ромба class File {...}; class InputFile: public File {...}; class OutputFile: public File {...}; class
- 4. Виртуальное наследование class File {...}; // виртуальный базовый класс class InputFile: virtual public File {...}; class
- 5. В стандартной библиотеке C++ есть похожая иерархия, только классы в ней являются шаблонными и называются basic_ios,
- 6. Ответственность за инициализацию виртуального базового класса ложится на самый дальний производный класс в иерархии. Отсюда следует,
- 7. Пример интерфейсного класса class IPerson { public: virtual ~IPerson(); virtual std::string name() const = 0; virtual
- 8. Предположим, что старый, ориентированный только на базы данных класс PersonInfo предоставляет почти все необходимое для реализации
- 9. const char *PersonInfo::valueDelimOpen() const{ return “[“; // открывающий разделитель по умолчанию } const char *PersonInfo::valueDelimClose() const{
- 10. class CPerson: public IPerson, private PersonInfo { // используется множественное наследование // реализации функций-членов из интерфейса
- 11. • Множественное наследование сложнее одиночного. Оно может привести к неоднозначности и необходимости применять виртуальное наследование. •
- 12. class CartoonCharacter { // персонаж мультфильма public: virtual void dance() {} // по умолчанию – ничего
- 13. Множественное наследование? class Cricket : public CartoonCharacter, private Grasshopper { public: virtual void dance() ; virtual
- 14. class Insect: public CartoonCharacter { public: // Общий код для кузнечиков virtual void dance () ;
- 15. Обращение к именам в шаблонных базовых классах class CompanyA{ public: void sendClearText(const std::string& msg); void sendEncryptedText(const
- 16. template class MsgSender{ public: ... // конструктор, деструктор и т. п. void sendClear(const MsgInfo& info){ std::string
- 17. class CompanyZ { // этот класс не представляет функции sendCleartext public: … void sendEncrypted(const std::string& msg);
- 18. Варианты решения 1. Можно предварить обращения к функциям из базового класса указателем this: template class LoggingMsgSender:
- 19. 2. Можно воспользоваться using-объявлением (делает скрытые имена из базового класса видимыми в производном классе). template class
- 20. 3. Явно указать, что вызываемая функция находится в базовом классе (недостаток: если вызываемая функция виртуальна, то
- 21. С точки зрения видимости имен, все три подхода эквивалентны: они обещают компилятору, что любая специализация шаблона
- 22. Разбухание кода в результате применения шаблонов template // шаблон матрицы размерностью n x n, class SquareMatrix
- 23. template // базовый класс, не зависящий class SquareMatrixBase { // от размерности матрицы protected: void invert(std::size_t
- 24. template class SquareMatrixBase { protected: ... SquareMatrixBase(std::size_t n, T pMem) :size(n), pData(pMem){} // и указатель на
- 26. Скачать презентацию