Runtime polymorphism in C++ - Time & Space Complexity
When using runtime polymorphism, the program decides which function to run while it is running. We want to understand how this choice affects how long the program takes.
How does the program's running time change when it picks functions at runtime?
Analyze the time complexity of the following code snippet.
class Base {
public:
virtual void show() { /* base action */ }
};
class Derived : public Base {
public:
void show() override { /* derived action */ }
};
void callShow(Base* obj, int n) {
for (int i = 0; i < n; i++) {
obj->show();
}
}
This code calls a function through a pointer to a base class. The actual function called depends on the real object type at runtime.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The loop calls
show()methodntimes. - How many times: Exactly
ntimes, once per loop iteration.
Each time we increase n, the number of calls to show() grows the same amount.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 calls to show() |
| 100 | 100 calls to show() |
| 1000 | 1000 calls to show() |
Pattern observation: The work grows directly with n. Doubling n doubles the calls.
Time Complexity: O(n)
This means the time to run grows in a straight line as the number of calls increases.
[X] Wrong: "Runtime polymorphism makes the code run much slower, like quadratic time."
[OK] Correct: Each call still happens once per loop. The extra step to find the right function is constant time, so total time grows linearly with n.
Understanding how runtime polymorphism affects time helps you explain your code choices clearly and shows you know how programs behave in real situations.
"What if the show() method itself contained a loop running m times? How would the time complexity change?"
Practice
virtual functions in C++ runtime polymorphism?Solution
Step 1: Understand virtual functions role
Virtual functions allow a base class to declare a function that derived classes can override.Step 2: Explain runtime decision
At runtime, the program decides which overridden function to call based on the actual object type.Final Answer:
To allow derived classes to override base class methods and decide at runtime which method to call -> Option DQuick Check:
Virtual functions enable runtime method selection [OK]
- Thinking virtual speeds up function calls
- Believing virtual prevents overriding
- Confusing virtual with memory allocation
Solution
Step 1: Recall virtual function syntax
The keywordvirtualcomes before the return type in the function declaration.Step 2: Match correct syntax
virtual void display(); correctly placesvirtualbeforevoid display();Final Answer:
virtual void display(); -> Option CQuick Check:
Virtual keyword precedes return type [OK]
- Placing virtual after function name
- Using virtual as a label or modifier incorrectly
- Missing semicolon after declaration
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;
}Solution
Step 1: Identify virtual function usage
Theshow()function inBaseis virtual and overridden inDerived.Step 2: Understand pointer type and object type
The pointer is of typeBase*but points to aDerivedobject, so the overriddenshow()inDerivedis called at runtime.Final Answer:
Derived -> Option AQuick Check:
Virtual function calls derived version [OK]
- Expecting base class method output
- Confusing pointer type with object type
- Ignoring virtual keyword effect
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;
}Solution
Step 1: Check base class function declaration
The base class functionsound()is not declaredvirtual, so no runtime polymorphism occurs.Step 2: Effect on function call
Becausesound()is not virtual, callinga->sound()calls the base class version, not the derived one.Final Answer:
Missing virtual keyword in base class function -> Option BQuick Check:
Virtual needed for runtime polymorphism [OK]
- Assuming override works without virtual
- Thinking pointer type causes error
- Ignoring virtual keyword importance
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;
}Solution
Step 1: Trace virtual function overrides
identify()is virtual inShape, overridden inCircle, and again inColoredCircle.Step 2: Determine actual object type at runtime
The pointerptris of typeShape*but points to aColoredCircleobject, so the most derived override runs.Final Answer:
Colored Circle -> Option AQuick Check:
Most derived override called at runtime [OK]
- Expecting base or intermediate class output
- Thinking multiple overrides cause errors
- Ignoring virtual override chain
Ready to prove it?
Pass the test and this pattern moves unknown
