t_virtual.mod 983 B

12345678910111213141516171819202122232425262728293031323334
  1. MODULE TVirtual;
  2. (* Virtual dispatch (vtables): a base-class pointer holding a derived
  3. object calls the derived method. Exit 3. *)
  4. VAR ExitCode : INTEGER;
  5. TYPE
  6. CLASS Shape;
  7. VIRTUAL PROCEDURE Draw() : INTEGER;
  8. END Shape;
  9. CLASS Circle (Shape);
  10. VIRTUAL PROCEDURE Draw() : INTEGER;
  11. END Circle;
  12. CLASS Square (Shape);
  13. VIRTUAL PROCEDURE Draw() : INTEGER;
  14. END Square;
  15. CLASS IMPLEMENTATION Shape;
  16. PROCEDURE Draw() : INTEGER; BEGIN RETURN 1 END Draw;
  17. END Shape;
  18. CLASS IMPLEMENTATION Circle;
  19. PROCEDURE Draw() : INTEGER; BEGIN RETURN 2 END Draw;
  20. END Circle;
  21. CLASS IMPLEMENTATION Square;
  22. PROCEDURE Draw() : INTEGER; BEGIN RETURN 3 END Draw;
  23. END Square;
  24. VAR b : POINTER TO Shape;
  25. VAR c : POINTER TO Circle;
  26. VAR q : POINTER TO Square;
  27. BEGIN
  28. ExitCode := 0;
  29. NEW(c); b := c; (* subtype pointer assignment *)
  30. IF b^.Draw() = 2 THEN ExitCode := ExitCode + 1 END;
  31. NEW(q); b := q;
  32. IF b^.Draw() = 3 THEN ExitCode := ExitCode + 2 END
  33. END TVirtual.