19.3.2. Устоявшие функции и последовательности пользовательских преобразований
19.3.2. Устоявшие функции и последовательности пользовательских преобразований
Наследование оказывает влияние и на второй шаг разрешения перегрузки функции: отбор устоявших из множества кандидатов. Устоявшей называется функция, для которой существуют приведения типа каждого фактического аргумента к типу соответственного формального параметра.
В разделе 15.9 мы показали, как разработчик класса может предоставить пользовательские преобразования для объектов этого класса, которые неявно вызываются компилятором для трансформации фактического аргумента функции в тип соответственного формального параметра. Пользовательские преобразования бывают двух видов: конвертер или конструктор с одним параметром без ключевого слова explicit. При наследовании на втором шаге разрешения перегрузки рассматривается более широкое множество таких преобразований.
Конвертеры наследуются, как и любые другие функции-члены класса. Например, мы можем написать следующий конвертер для ZooAnimal:
class ZooAnimal {
public:
// конвертер: ZooAnimal == const char*
operator const char*();
// ...
};
Производный класс Bear наследует его от своего базового ZooAnimal. Если значение типа Bear используется в контексте, где ожидается const char*, то неявно вызывается конвертер для преобразования Bear в const char*:
extern void display( const char* );
Bear yogi;
// правильно: yogi == const char*
display( yogi );
Конструкторы с одним аргументом без ключевого слова explicit образуют другое множество неявных преобразований: из типа параметра в тип своего класса. Определим такой конструктор для ZooAnimal:
class ZooAnimal {
public:
// преобразование: int == ZooAnimal
ZooAnimal( int );
// ...
};
Его можно использовать для приведения значения типа int к типу ZooAnimal. Однако конструкторы не наследуются. Конструктор ZooAnimal нельзя применять для преобразования объекта в случае, когда целевым является тип производного класса:
const int cageNumber = 8788l
void mumble( const Bear & );
// ошибка: ZooAnimal( int ) не используется
mumble( cageNumber );
Поскольку целевым типом является Bear – тип параметра функции mumble(), то рассматриваются только его конструкторы.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
94. Избегайте преобразований, отменяющих const
94. Избегайте преобразований, отменяющих const РезюмеПреобразование типов, отменяющее const, может привести к неопределенному поведению, а кроме того, это свидетельство плохого стиля программирования даже в том случае, когда применение такого преобразования вполне
97. Не используйте объединения для преобразований
97. Не используйте объединения для преобразований РезюмеХитрость все равно остается ложью: объединения можно использовать для получения "преобразования типа без преобразования", записывая информацию в один член и считывая из другого. Однако это еще более опасно и менее
9.4.2. Устоявшие функции
9.4.2. Устоявшие функции Устоявшая функция относится к числу кандидатов. В списке ее формальных параметров либо то же самое число элементов, что и в списке фактических аргументов вызванной функции, либо больше. В последнем случае для дополнительных параметров задаются
15.12.2. Устоявшие функции
15.12.2. Устоявшие функции Множество устоявших операторных функций формируется из множества кандидатов путем отбора лишь тех операторов, которые могут быть вызваны с заданными операндами. Например, какие из семи найденных выше кандидатов устоят? Оператор использован в
Использование преобразований
Использование преобразований Обмен данными дата/время с другими приложениямиИмпорт данных дата/время, созданных в другом месте, - например, в другой системе базы данных, во включающем языке или в устройстве получения даты - обычно требует некоторых предварительных
Включение преобразований
Включение преобразований Подобно тому, как мы бы использовали в языке С директиву #include для включения внешних файлов, преобразования в XSLT могут использовать для той же самой цели элемент xsl:include. Правда, в отличие от языка С, условное включение в XSLT
Импорт преобразований
Импорт преобразований Другим способом использования внешних модулей в XSLT является импорт преобразований, который обеспечивается элементом xsl:import. Импорт преобразований более сложен, чем их простое включение — последовательность импорта модулей может влиять на то, как
Выполнение XSLT-преобразований в C/C++
Выполнение XSLT-преобразований в C/C++ В качестве примера использования XSLT в языках С и С++ мы приведем очень простую программу, которая выполняет над документом source.xml преобразование stylesheet.xsl и выводит результат в файл document.out. На этот раз в качестве процессора мы будем
Выполнение XSLT-преобразований в PHP
Выполнение XSLT-преобразований в PHP Начиная с четвертых версий, PHP поставляется вместе с XSLT-процессором Sablotron, который включен в РНР в качестве расширения.Для того чтобы использовать Sablotron в PHP-скриптах, следует выполнить следующие действия:1. Убедиться, что файл php_sablot.dll
Выполнение XSLT-преобразований в Java
Выполнение XSLT-преобразований в Java Язык Java традиционно широко поддерживает XML-технологии: большинство передовых разработок в этой области реализуется, как правило, сначала на Java и уж затем переносится на другие платформы разработки.Не стал исключением и XSLT. Можно смело
Глава 15 Использование эффектов и преобразований
Глава 15 Использование эффектов и преобразований В главе 9 мы изучили фильтры и наложения, которые можно использовать для создания различного рода специальных эффектов (тени, размытия и пр.). Все они призваны помочь на первых порах начинающим пользователям. Опытные
3.6. ПОДХОДЫ НА ОСНОВЕ ФОРМАЛЬНЫХ ПРЕОБРАЗОВАНИЙ
3.6. ПОДХОДЫ НА ОСНОВЕ ФОРМАЛЬНЫХ ПРЕОБРАЗОВАНИЙ Эта группа подходов содержит максимально формальные требования к виду работ создания программного обеспечения.Технология стерильного цеха. Основные идеи технологии стерильного цеха (cleanroom process model) были предложены