LEC_cpp3 (1119518), страница 2
Текст из файла (страница 2)
....
for (int i =0; i < N; i++)
total_area += p[i] -> area();
...
Интерфейсы.
Интерфейсами называют абстрактные классы, не содержащие нестатических полей-данных, все функции которых являются открытыми чистыми виртуальными функциями.
Реализация виртуальных функций
Для реализации аппарата виртуальных методов Б. Страуструп решил использовать механизм косвенного вызова через специальные, связанные с каждым классом, содержащем виртуальные функции, массивы указателей на функции-члены. Такие массивы называются таблицами виртуальных функций или vtbl. В каждый объект такого класса компилятор неявно помещает указатель vtbl* pvtbl на соответствующую vtbl, в которой хранятся адреса виртуальных методов.
Пусть есть описания:
class A {
int a;
public:
virtual void f ();
virtual void g (int);
virtual void h (double);
};
class B : public A {
public:
int b;
void g (int);
virtual void m (B*);
};
class C : public B {
public:
int c;
void h (double);
virtual void n (C*);
};
Тогда С с; ~ a vtbl для с ~ &A:: f
pvtbl &B:: g
b &C:: h
c &B:: m
&C:: n
В точке виртуального вызова по указателю на объект сначала определяется адрес таблицы виртуальных функций, затем по смещению в этой таблице определяется собственно адрес вызываемой функции. Например,
C c;
A *p = &c;
p -> g (2); ~ (* ( p -> pvtbl [1]) ) (p, 2); // p = this
Таким образом, при использовании аппарата виртуальных функций издержки по памяти для каждого полиморфного объекта выливаются в неявное хранение дополнительного указателя.
Виртуальный вызов оказывается достаточно дорогой операцией потому, что требует два обращения к памяти.
8