ВУЗ:
Составители:
Рубрика:
108
Значительно чаще, чем преобразование типов, используется пре-
образование указателей на эти типы. Существует два типа преобразова-
ния указателей – явное и неявное. Явное преобразование будет выпол-
нено всегда, неявное – только в определённых случаях.
Если базовый класс является общим (public) базовым классом, т.е.
мы имеем дело с отношением вида
class Base {…};
class Der: public Base {…};
то принципы преобразования очень просты: неявно может быть выпол-
нено преобразование указателя типа Der* к указателю типа Base*. Об-
ратное преобразование обязательно должно быть явным.
Другими словам, при обращении через указатели объект произ-
водного типа может рассматриваться как объект базового тип. Обратное
утверждение неверно:
Der derived;
Base *bp = &derived; // Неявное преобразование.
Der *dp1 = bp; // Ошибка.
Der *dp2 = (Der*) bp; // Явное преобразование; теперь верно.
То, что производный класс в некотором смысле может рассматри-
ваться как его базовый, оказывает влияние на выбор нужной версии пе-
реопределённой функции. Сложность возникает, если для выбора одно-
го из вариантов нужно выполнить неявное преобразование типов.
Правила здесь таковы.
Если нет точного соответствия списка формальных и фактических
параметров, то наивысший приоритет среди выполняемых преобразова-
ний имеют преобразования производного типа к базовому. Это относит-
ся как к самому типу, так и к указателю на него. Только в том случае,
если это невозможно, компилятор пробует выполнить другие преобра-
зования (например, стандартные преобразования указателей).
Пример:
class Base {…};
class Der: public Base {…};
func (Base*);
func (void*);
…
Der *dp;
float *fp;
func (dp); // Вызов func (Base*).
Страницы
- « первая
- ‹ предыдущая
- …
- 104
- 105
- 106
- 107
- 108
- …
- следующая ›
- последняя »
