Bird
Raised Fist0
C++programming~10 mins

Runtime polymorphism in C++ - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Runtime polymorphism
Create base class pointer
↓
Assign derived class object
↓
Call virtual function
↓
At runtime, decide which function to call
↓
Execute derived class function if overridden
↓
End
Runtime polymorphism lets a program decide which function to call during execution using base class pointers to derived objects.
Execution Sample
C++
#include <iostream>
using namespace std;
class Base {
public:
  virtual void show() { cout << "Base"; }
};
class Derived : public Base {
public:
  void show() override { cout << "Derived"; }
};
int main() {
  Base* b = new Derived();
  b->show();
  delete b;
  return 0;
}
This code creates a base class pointer to a derived class object and calls a virtual function, showing runtime polymorphism.
Execution Table
StepActionPointer TypeObject TypeFunction CalledOutput
1Create Derived object-Derived--
2Assign Derived object to Base pointerBase*Derived--
3Call show() via Base pointerBase*DerivedDerived::show()Derived
4Program ends----
💡 Program ends after calling Derived::show() via Base pointer due to virtual function.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
b (Base*)nullptrnullptrpoints to Derived objectpoints to Derived objectpoints to Derived object
Key Moments - 2 Insights
Why does calling show() on a Base pointer call Derived's show()?
Because show() is declared virtual in Base, the program decides at runtime to call Derived's version, as shown in execution_table step 3.
What if show() was not virtual? Which function would be called?
If show() was not virtual, Base's show() would be called even if the pointer points to Derived, because function binding would happen at compile time.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the output at step 3?
ABase
BDerived
CNo output
DCompilation error
💡 Hint
Check the 'Output' column in execution_table row for step 3.
At which step does the Base pointer start pointing to the Derived object?
AStep 3
BStep 1
CStep 2
DStep 4
💡 Hint
Look at the 'Pointer Type' and 'Object Type' columns in execution_table.
If show() was not virtual, how would the function called at step 3 change?
ABase::show() would be called
BNo function would be called
CDerived::show() would still be called
DProgram would crash
💡 Hint
Refer to key_moments explanation about virtual keyword effect.
Concept Snapshot
Runtime polymorphism in C++ uses virtual functions.
Base class declares a function virtual.
Derived class overrides it.
Base class pointer can point to Derived object.
Calling virtual function via base pointer calls derived version at runtime.
Full Transcript
Runtime polymorphism allows a program to decide which function to call while running. In C++, this is done using virtual functions. A base class declares a function as virtual. A derived class overrides this function. When a base class pointer points to a derived class object and calls the virtual function, the derived class's version runs. This is shown in the example where a Base pointer points to a Derived object. Calling show() on the Base pointer calls Derived's show() because of the virtual keyword. If the function was not virtual, Base's version would run instead. This behavior is called dynamic dispatch and is key to runtime polymorphism.

Practice

(1/5)
1. What is the main purpose of virtual functions in C++ runtime polymorphism?
easy
A. To allocate memory for objects dynamically
B. To make functions run faster by avoiding function calls
C. To prevent any function from being overridden in derived classes
D. To allow derived classes to override base class methods and decide at runtime which method to call

Solution

  1. Step 1: Understand virtual functions role

    Virtual functions allow a base class to declare a function that derived classes can override.
  2. Step 2: Explain runtime decision

    At runtime, the program decides which overridden function to call based on the actual object type.
  3. Final Answer:

    To allow derived classes to override base class methods and decide at runtime which method to call -> Option D
  4. Quick Check:

    Virtual functions enable runtime method selection [OK]
Hint: Virtual means choose function at runtime, not compile time [OK]
Common Mistakes:
  • Thinking virtual speeds up function calls
  • Believing virtual prevents overriding
  • Confusing virtual with memory allocation
2. Which of the following is the correct syntax to declare a virtual function in a base class?
easy
A. void display() virtual;
B. void virtual display();
C. virtual void display();
D. virtual: void display();

Solution

  1. Step 1: Recall virtual function syntax

    The keyword virtual comes before the return type in the function declaration.
  2. Step 2: Match correct syntax

    virtual void display(); correctly places virtual before void display();
  3. Final Answer:

    virtual void display(); -> Option C
  4. Quick Check:

    Virtual keyword precedes return type [OK]
Hint: Virtual always goes before return type in declaration [OK]
Common Mistakes:
  • Placing virtual after function name
  • Using virtual as a label or modifier incorrectly
  • Missing semicolon after declaration
3. What will be the output of the following code?
class Base {
public:
    virtual void show() { std::cout << "Base"; }
};
class Derived : public Base {
public:
    void show() override { std::cout << "Derived"; }
};
int main() {
    Base* ptr = new Derived();
    ptr->show();
    delete ptr;
    return 0;
}
medium
A. Derived
B. Base
C. Compilation error
D. Runtime error

Solution

  1. Step 1: Identify virtual function usage

    The show() function in Base is virtual and overridden in Derived.
  2. Step 2: Understand pointer type and object type

    The pointer is of type Base* but points to a Derived object, so the overridden show() in Derived is called at runtime.
  3. Final Answer:

    Derived -> Option A
  4. Quick Check:

    Virtual function calls derived version [OK]
Hint: Virtual functions call derived method via base pointer [OK]
Common Mistakes:
  • Expecting base class method output
  • Confusing pointer type with object type
  • Ignoring virtual keyword effect
4. Identify the error in the following code snippet related to runtime polymorphism:
class Animal {
public:
    void sound() { std::cout << "Animal sound"; }
};
class Dog : public Animal {
public:
    void sound() { std::cout << "Bark"; }
};
int main() {
    Animal* a = new Dog();
    a->sound();
    delete a;
    return 0;
}
medium
A. Incorrect pointer type declaration
B. Missing virtual keyword in base class function
C. Derived class function should be static
D. Memory leak due to missing delete

Solution

  1. Step 1: Check base class function declaration

    The base class function sound() is not declared virtual, so no runtime polymorphism occurs.
  2. Step 2: Effect on function call

    Because sound() is not virtual, calling a->sound() calls the base class version, not the derived one.
  3. Final Answer:

    Missing virtual keyword in base class function -> Option B
  4. Quick Check:

    Virtual needed for runtime polymorphism [OK]
Hint: Base function must be virtual for polymorphism [OK]
Common Mistakes:
  • Assuming override works without virtual
  • Thinking pointer type causes error
  • Ignoring virtual keyword importance
5. Given the classes below, what will be the output when ptr->identify() is called?
class Shape {
public:
    virtual void identify() { std::cout << "Shape"; }
};
class Circle : public Shape {
public:
    void identify() override { std::cout << "Circle"; }
};
class ColoredCircle : public Circle {
public:
    void identify() override { std::cout << "Colored Circle"; }
};
int main() {
    Shape* ptr = new ColoredCircle();
    ptr->identify();
    delete ptr;
    return 0;
}
hard
A. Colored Circle
B. Circle
C. Shape
D. Compilation error due to multiple overrides

Solution

  1. Step 1: Trace virtual function overrides

    identify() is virtual in Shape, overridden in Circle, and again in ColoredCircle.
  2. Step 2: Determine actual object type at runtime

    The pointer ptr is of type Shape* but points to a ColoredCircle object, so the most derived override runs.
  3. Final Answer:

    Colored Circle -> Option A
  4. Quick Check:

    Most derived override called at runtime [OK]
Hint: Runtime calls most derived override in inheritance chain [OK]
Common Mistakes:
  • Expecting base or intermediate class output
  • Thinking multiple overrides cause errors
  • Ignoring virtual override chain
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard