По последним данным, на рынке продается по крайней мере 2 768 942 книги о С++, не говоря уже о всевозможных курсах, обучающих программах, журналах и семинарах с коктейлями. И все же в этом изобилии наблюдается удручающее однообразие.
После того как будут определены все непосредственно доступные объекты, возникает следующая проблема: идентифицировать объекты, к которым возможны косвенные обращения внутри периметра.
Теоретически каждый объект может обратиться к любому другому объекту. Тем не менее, объекты ссылаются друг на друга ограниченным числом способов.
Переменные классов
Один объект может быть внедрен в другой как переменная класса, или же переменная класса может представлять собой указатель или ссылку на другой объект.
Аргументы функций классов
Один объект может получить доступ к другому через аргументы своих функций. На самом деле это лишь частный случай рассмотренных выше стековых переменных.
void Foo::f(Bar* b)
{
b->member_of_Bar();
}
Базовые классы
Базовый класс в С++ интерпретируется так, словно он является внедренным объектом. Как было показано в предыдущей главе, это особенно справедливо для множественного наследования и виртуальных базовых классов. По адресу одного объекта вы можете сослаться на несколько разных логических объектов внутри него - одни являются переменными класса, а другие - базовыми классами. Как правило, адреса этих объектов отличны от того объекта, которому они принадлежат.