CONCEPT
        overloading

DESCRIPTION
        This concept is strongly connected with the concept of inheritance.
        A function is called 'overloaded' if it is defined more than once
        in an object. This can happen if the object inherits other objects
        which have defined a function with the same name.
        Usually the overloading is wanted and intended by the inheriting
        object to change the behaviour of the function it overloads.
        To call the overloaded functions from the overloading object the
        ::-operator is used.
        From outside the object only one of the functions can be called
        via call_other() or the like; this will be the topmost of all
        overloaded functions.

        Normally an overloading function is declared the same way as the
        overloaded function, this means it has the same number and types
        of arguments. If an object wants to change the behaviour of the
        function in a way that it can get more arguments than the original
        function, it has to use the modifier 'varargs' or a compiler error
        will be raised.

EXAMPLE
        File /players/alfe/a.c:

            foo() { write("A"); }

        File /players/alfe/b.c:

            foo() { write("B"); }

        File /players/alfe/c.c:

            inherit "players/alfe/a";
            inherit "players/alfe/b";

            foo() {
              a::foo();
	      b::foo();
	      write("C");
	    }

	To call "players/alfe/c"->foo() will now result in the output of
	ABC.

SEE ALSO
        modifiers(LPC), inheritance(C), functions(LPC)
