Алгоритмы и структуры данных на С++. Аксёнова Е.А - 38 стр.

UptoLike

38 Глава 3. Классы
го же типа, то обращение к vf для объекта класса derived вызывает
derived::vf (даже при доступе через указатель или ссылку на base).
В таком случае говорят, что функция производного класса подменяет
(override) функцию базового класса. Если, однако, типы этих функ-
ций различны, то функции считаются различными и механизм вир-
туальности не включается. Ошибкой является различие виртуальной
функции базового и функции производного класса лишь в типе воз-
вращаемого значения.
class base
{
virtual void vf1();
virtual void vf2();
virtual void vf3();
void f();
};
class derived: public base
{
public:
void vf1();
void vf2(int);// скрывает base::vf2()
char vf3(); // ошибка, т. к. отличается только типом
// возвращаемого значения
void f();
};
void g()
{
derived d;
base *bp=&d; // стандартное преобразование
// derived* к base*
bp->vf1(); // вызов derived::vf1
bp->vf2(); // вызов base ::vf2
bp->f(); // вызов base ::f
}
В этом примере для объекта d класса derived вызываются соот-
ветственно derived::vf1, base::vf2 и base::f. Тем самым интер-
претация вызова виртуальной функции зависит от типа объекта, для
38                                               Глава 3. Классы


го же типа, то обращение к vf для объекта класса derived вызывает
derived::vf (даже при доступе через указатель или ссылку на base).
В таком случае говорят, что функция производного класса подменяет
(override) функцию базового класса. Если, однако, типы этих функ-
ций различны, то функции считаются различными и механизм вир-
туальности не включается. Ошибкой является различие виртуальной
функции базового и функции производного класса лишь в типе воз-
вращаемого значения.
class base
{
   virtual void vf1();
   virtual void vf2();
   virtual void vf3();
   void f();
};

class derived: public   base
{
   public:
     void vf1();
     void vf2(int);//   скрывает base::vf2()
     char vf3();   //   ошибка, т. к. отличается только типом
                   //   возвращаемого значения
     void f();
};

void g()
{
    derived d;
    base *bp=&d; //   стандартное преобразование
                 //   derived* к base*
    bp->vf1();   //   вызов derived::vf1
    bp->vf2();   //   вызов base ::vf2
    bp->f();     //   вызов base ::f
}
   В этом примере для объекта d класса derived вызываются соот-
ветственно derived::vf1, base::vf2 и base::f. Тем самым интер-
претация вызова виртуальной функции зависит от типа объекта, для