Составители:
Рубрика:
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. Тем самым интер-
претация вызова виртуальной функции зависит от типа объекта, для
Страницы
- « первая
- ‹ предыдущая
- …
- 36
- 37
- 38
- 39
- 40
- …
- следующая ›
- последняя »
