Для затравки:
Как функции, не являющиеся методами, улучшают инкапсуляцию Скотт Мейерс (Scott Meyers) Перевод А. И. Легалова Статья опубликована в C/C++ user Journal (February, 2000)
http://www.softcraft.ru/coding/sm/sm01.shtml
Скотт Мейерс предлагает следующий алгоритм:
if (f необходимо быть виртуальной)
сделайте f функцией-членом C;
else if (f - это operator>> или operator<<)
{
сделайте f функцией - не членом;
if (f необходим доступ к непубличным членам C)
сделайте f другом C;
}
else if (f необходимо преобразовывать тип его крайнего левого аргумента)
{
сделайте f функцией - не членом;
if (f необходимо иметь доступ к непубличным членам C)
сделайте f другом C;
}
else if (f может быть реализована через доступный интерфейс класса)
сделайте f функцией - не членом;
else
сделайте f функцией-членом C;
Вопрос: а зачем так сложно? Давайте проще:
IF f необходимо быть виртуальной THEN сделайте f функцией членом ELSE сделайте f внешней функцией END
Все связанные с типом процедуры — виртуальны, а если нужны не виртуальные, а обычные, то для этого есть обычные процедуры не связываемые с типом.
1)
X.f(); Вызов связанной с типом "виртуальной" процедуры f()
2)
g(X); Вызов не связанной с типом обычной процедуры g()
3) третьего не дано, так как все остальное излишне
С аргументами:
X.f(a, b, c);
g(X, a, b, c);
Пример:
PROCEDURE MovePoint(VAR p: Point; dx, dy: INTEGER);
BEGIN
p.SetX(p.GetX() + dx); (* Вызов виртуальных методов GetX/SetX *)
p.SetY(p.GetY() + dy); (* Вызов виртуальных методов GetY/SetY *)
END;
Короче, если метод не виртуальный, то зачем он метод? Пусть он будет не методом, а внешней процедурой. А все оставшиеся методы — все поголовно виртуальны.