| 12345678910111213141516171819202122232425262728293031323334 |
- MODULE TVirtual;
- (* Virtual dispatch (vtables): a base-class pointer holding a derived
- object calls the derived method. Exit 3. *)
- VAR ExitCode : INTEGER;
- TYPE
- CLASS Shape;
- VIRTUAL PROCEDURE Draw() : INTEGER;
- END Shape;
- CLASS Circle (Shape);
- VIRTUAL PROCEDURE Draw() : INTEGER;
- END Circle;
- CLASS Square (Shape);
- VIRTUAL PROCEDURE Draw() : INTEGER;
- END Square;
- CLASS IMPLEMENTATION Shape;
- PROCEDURE Draw() : INTEGER; BEGIN RETURN 1 END Draw;
- END Shape;
- CLASS IMPLEMENTATION Circle;
- PROCEDURE Draw() : INTEGER; BEGIN RETURN 2 END Draw;
- END Circle;
- CLASS IMPLEMENTATION Square;
- PROCEDURE Draw() : INTEGER; BEGIN RETURN 3 END Draw;
- END Square;
- VAR b : POINTER TO Shape;
- VAR c : POINTER TO Circle;
- VAR q : POINTER TO Square;
- BEGIN
- ExitCode := 0;
- NEW(c); b := c; (* subtype pointer assignment *)
- IF b^.Draw() = 2 THEN ExitCode := ExitCode + 1 END;
- NEW(q); b := q;
- IF b^.Draw() = 3 THEN ExitCode := ExitCode + 2 END
- END TVirtual.
|