|
Программирование >> Перегруженные имена функций и идентификаторы
n2.tword. В этом примере предполагается, что функции strlen, error и strcpy описаны где-то в другом месте как внешние функции. В члене функции ключевое слово this указывает на объект, для которого вызвана функция. Типом this в функции, которая является членом класса cl, является cl*. Если mem - член класса cl, то mem и this->mem - синонимы в функции члене класса cl (если mem не был использован в качестве имени локальной переменной в промежуточной области видимости). Функция член может быть определена в описании класса. Помещение определения функции члена в описание класса является кратким видом записи описания ее в описании класса и затем определения ее как inline сразу после описания класса. Например: int b; struct x int f () { return b; } int f () { return b; } int b; }; означает int b; struct x int f (); int b; }; inline x.f () { return b; } Для функций членов не нужно использование спецификатора overload: если имя описывается как означающее несколько имен в классе, то оно перегружено. Применение операции получения адреса к функциям членам допустимо. Тип параметра результирующей функции указатель на есть (...), то есть, неизвестен. Любое использование его является зависимым от реализации, поскольку способ инициализации указателя для вызова функции члена не определен. Производные классы В конструкции агрег идентификатор:pub1ic opt typedef-имя typedef-имя должно означать ранее описанный класс, называемый базовым классом для класса, подлежащего описанию. Говорится, что последний выводится из предшествующего. На члены базового класса можно ссылаться, как если бы они были членами производного класса, за исключением тех случаев, когда имя базового члена было переопределено в производном классе; в этом случае для ссылки на скрытое имя может использоваться такая запись: typedef-имя :: идентификатор Например: struct base int a; int b; }; struct derived : public base int b; int c; derived d; d.a = 1; d.base::b = 2; d.b = 3; d.c = 4; осуществляет присваивание четырем членам d. Производный тип сам может использоваться как базовый. Виртуальные функции Если базовый класс base содержит (виртуальную) virtual функцию vf, а производный класс derived также содержит функцию vf, то вызов vf для объекта класса derived вызывает derived::vf. Например: struct base virtual void vf (); void f (); }; struct derived : public base void vf (); void f (); }; derived d; base* bp = &d; bp->vf (); bp->f (); Вызовы вызывают, соответственно, derived::vf и base::f дя объекта класса derived, именованного d. Так что интерпретация вызова виртуальной функции зависит от типа объекта, для которого она вызвана, в то время как интерпретация вызова невиртуальной функции зависит только от типа указателя, обозначающего объект. Из этого следует, что тип объектов классов с виртуальными функциями и объектов классов, выведенных из таких классов, могут быть определены во время выполнения. Если производный класс имеет член с тем же именем, что и у виртуальной функции в базовом классе, то оба члена должны иметь одинаковый тип. Виртуальная функция не может быть другом (friend). Функция f в классе, выведенном из класса, который имеет виртуальную функцию f, сама рассматривается как виртуальная. Виртуальная функция в базовом классе должна быть определена. Виртуальная функция, которая была определена в базовом классе, не нуждается в определении в производном классе. В этом случае функция, определенная для базового класса, используется во всех вызовах.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |