In which contexts are virtual calls effectively resolved at compile time (i.e., dynamic dispatch is suppressed) in C++? Choose the standard situations where a virtual call does not dispatch to a more derived override at runtime.

Difficulty: Medium

Correct Answer: Both A and B.

Explanation:


Introduction:
Virtual functions normally dispatch based on the object's dynamic type. However, C++ intentionally disables dynamic dispatch in specific phases of an object's lifetime. This question asks you to identify those well-defined exceptions.


Given Data / Assumptions:

  • We have a polymorphic base class with virtual functions and a derived class overriding them.
  • Calls originate from base-class constructors/destructors.
  • Standard object model semantics apply (vptr initialization order).


Concept / Approach:
During construction and destruction, the dynamic type is treated as the class whose constructor or destructor is currently running. The most-derived subobject is not yet fully formed (in a constructor) or is being torn down (in a destructor). Therefore, a virtual call behaves as if it were non-virtual, targeting the function of the current class—this is often described as “devirtualized by the language rules,” not merely by optimization.


Step-by-Step Solution:
1) In Base::Base(), a call to a virtual f() resolves to Base::f(), even if Derived overrides f().2) In Base::~Base(), a call to f() also resolves to Base::f() for safety; derived resources may already be destroyed.3) Outside these phases (e.g., in main or any ordinary context), virtual dispatch works normally through the vtable.4) Hence the correct combined choice is “Both A and B”.


Verification / Alternative check:
Compile a demo printing which override runs from constructors/destructors; observe base version prints despite a Derived instance.


Why Other Options Are Wrong:
main(): ordinary context; virtual dispatch operates as usual when calling through base pointers/references.A only / B only: incomplete; both phases suppress dispatch.


Common Pitfalls:
Relying on virtual calls in constructors/destructors for initialization/cleanup in derived classes; prefer calling non-virtual helpers or using factory/setup methods.


Final Answer:
Both A and B.

More Questions from OOPS Concepts

Discussion & Comments

No comments yet. Be the first to comment!
Join Discussion