Составители:
Рубрика:
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
- …
- следующая ›
- последняя »