NivaarExam PrepOfficial exam papers ↗

25-Comp-B11 Advanced Software Design · December 2019

Question 24 of 28: Polymorphism, Dynamic Binding, Overloading, and Overriding

Nivaar worked solution (AI-drafted; not reviewed by a licensed engineer)

Notes on this paper

17-Comp-B11 Advanced Software Design — National Exams, December 2019. 3 hours, closed book exam with one aid sheet allowed (written on both sides), no calculator permitted. The paper is organized into five parts, and candidates were instructed to answer any five (5) questions in Part I, any three (3) in Part II, any four (4) in Part III, any two (2) in Part IV, and any five (5) in Part V — only the first questions answered, in each part, as they appear in the answer book are marked. All questions carry equal weight, so the 19 questions actually marked (5+3+4+2+5 of 28) each count for 100/19 ≈ 5.26% of the paper. All 28 questions are answered below for completeness.

Reference texts: Sommerville, Software Engineering (10th ed., Pearson) — software processes, requirements engineering, design principles, testing, dependability; Pressman, Software Engineering: A Practitioner's Approach (9th ed.) — supplementary process and quality coverage; Gamma, Helm, Johnson & Vlissides (GoF), Design Patterns: Elements of Reusable Object-Oriented Software — creational/structural/behavioural pattern catalogue and the "program to an interface, not an implementation" / "favor object composition over class inheritance" principles; Sebesta, Concepts of Programming Languages (12th ed.) — polymorphism, dynamic binding, visibility, and multiple inheritance semantics; Bertrand Meyer, Object-Oriented Software Construction — design by contract, preconditions/postconditions/class invariants; Barbara Liskov's 1987 substitutability paper for Question 12; Karl Wiegers, Software Requirements (3rd ed.); Myers, The Art of Software Testing, for Question 6.

PART I — General Principles (answer any 5 of 7)

Question 24: Polymorphism, Dynamic Binding, Overloading, and Overriding (Part V)

Question text not reproduced: the examination questions are © Engineers and Geoscientists BC. Open the official past paper (linked at the top of this page) to read the question, then follow the worked solution below.

Polymorphism is the ability of a single name to refer to objects of more than one type, so code written against a general (base/interface) reference operates uniformly over different concrete types (Question 26's "program to an interface" is what makes this useful in practice).

Dynamic binding (late binding) is the RUNTIME mechanism that resolves a polymorphic call to the actual implementing method based on the object's real runtime type, typically via a per-class dispatch table (vtable) consulted at the moment of the call.

Overriding is a subclass supplying its own implementation of a method already declared in a superclass, with an IDENTICAL signature — this is what dynamic binding dispatches between (and, per Question 12's LSP, must not strengthen the base method's precondition or weaken its postcondition).

Overloading is defining multiple methods that share the same name but differ in parameter signature, resolved entirely at COMPILE time with no runtime dispatch involved — a different mechanism from overriding despite the similar name.

class Bird {
    public void makeSound() { System.out.println("..."); }      // overridden below
}
class Sparrow extends Bird {
    @Override
    public void makeSound() { System.out.println("Chirp"); }    // OVERRIDING
}
class SoundUtil {
    void play(Bird b)   { b.makeSound(); }                       // OVERLOADING:
    void play(String s) { System.out.println(s); }               // same name, different signature
}
Bird b = new Sparrow();   // POLYMORPHISM: a Bird reference holds a Sparrow
b.makeSound();            // DYNAMIC BINDING: resolved to Sparrow.makeSound() at runtime

How they relate. Overriding plus dynamic binding together are the runtime mechanism that implements subtype polymorphism; overloading is a completely different, compile-time kind of polymorphism (ad hoc) that never touches the vtable at all — a method accidentally declared with a matching name but a different signature silently overloads rather than overrides, and never participates in dynamic dispatch.