Bird
Raised Fist0
C++programming~10 mins

Base class pointers in C++ - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Base class pointers
Create Derived object
↓
Assign Derived object address to Base pointer
↓
Use Base pointer to access members
↓
Call functions via Base pointer
↓
If virtual, Derived version runs
↓
If not virtual, Base version runs
A pointer of base class type can hold address of derived class object. Calling functions depends on virtual keyword.
Execution Sample
C++
#include <iostream>

class Base {
public:
  void show() { std::cout << "Base show\n"; }
};

class Derived : public Base {
public:
  void show() { std::cout << "Derived show\n"; }
};

int main() {
  Derived d;
  Base* ptr = &d;
  ptr->show();
  return 0;
}
Shows how a base class pointer calls a function when pointing to a derived object.
Execution Table
StepActionPointer TypeObject Pointed ToFunction CalledOutput
1Create Derived object d-Derived object d--
2Assign address of d to Base pointer ptrBase*Derived object d--
3Call ptr->show()Base*Derived object dBase::show()Base show
4Program ends----
💡 Function called depends on pointer type and virtual keyword; here show() is non-virtual, so Base::show() runs
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
duninitializedDerived object createdDerived object createdDerived object createdDerived object created
ptruninitializeduninitializedpoints to d (Derived)points to d (Derived)points to d (Derived)
Key Moments - 2 Insights
Why does ptr->show() call Base::show() and not Derived::show()?
Because show() is not declared virtual in Base, the function called depends on pointer type, not object type. See execution_table step 3.
Can a Base class pointer hold address of a Derived class object?
Yes, a Base class pointer can point to a Derived object. This is shown in execution_table step 2.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what function is called at step 3?
ADerived::show()
BBase::show()
CNo function called
DCompiler error
💡 Hint
Check the 'Function Called' column at step 3 in execution_table.
At which step does the Base pointer start pointing to the Derived object?
AStep 2
BStep 3
CStep 1
DStep 4
💡 Hint
Look at the 'Pointer Type' and 'Object Pointed To' columns in execution_table.
If show() was declared virtual in Base, what would ptr->show() call at step 3?
ABase::show()
BNo function called
CDerived::show()
DCompiler error
💡 Hint
Virtual functions call the derived version when accessed via base pointer.
Concept Snapshot
Base class pointers can hold addresses of derived objects.
Calling functions via base pointer calls base version unless function is virtual.
Virtual functions enable polymorphism: derived version runs.
Non-virtual functions call base version regardless of object type.
Use base pointers for flexible code with inheritance.
Full Transcript
This example shows how a pointer of base class type can point to a derived class object. We create a Derived object d, then assign its address to a Base class pointer ptr. When we call ptr->show(), since show() is not virtual, the Base class version runs, printing 'Base show'. If show() were virtual, the Derived version would run instead. This demonstrates how base class pointers work and how virtual functions enable polymorphism.

Practice

(1/5)
1. What does a base class pointer in C++ allow you to do?
easy
A. Only point to base class objects
B. Point to objects of derived classes
C. Only point to primitive data types
D. Prevent any pointer arithmetic

Solution

  1. Step 1: Understand base and derived classes

    A base class is a general class, and derived classes extend it with more features.
  2. Step 2: Role of base class pointers

    A base class pointer can point to any object of the base class or its derived classes, enabling polymorphism.
  3. Final Answer:

    Point to objects of derived classes -> Option B
  4. Quick Check:

    Base pointer can point to derived objects [OK]
Hint: Base pointers can point to derived objects [OK]
Common Mistakes:
  • Thinking base pointers only point to base objects
  • Confusing pointers with references
  • Assuming base pointers can't access derived objects
2. Which of the following is the correct syntax to declare a base class pointer named ptr for a class Base?
easy
A. Base *ptr;
B. ptr Base*;
C. Base ptr*;
D. *Base ptr;

Solution

  1. Step 1: Recall pointer declaration syntax

    In C++, a pointer to a type is declared as Type *pointerName;.
  2. Step 2: Apply to Base class

    For class Base, the pointer declaration is Base *ptr;.
  3. Final Answer:

    Base *ptr; -> Option A
  4. Quick Check:

    Pointer syntax = Type *name [OK]
Hint: Pointer syntax is Type *name; [OK]
Common Mistakes:
  • Placing * after variable name incorrectly
  • Swapping type and variable name
  • Using invalid syntax like *Base ptr
3. Consider the 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;
}

What is the output when this code runs?
medium
A. Derived
B. Base
C. Compilation error
D. Runtime error

Solution

  1. Step 1: Understand virtual function behavior

    The show() function is virtual in Base, so calls use the actual object's method.
  2. Step 2: Pointer points to Derived object

    The pointer ptr points to a Derived object, so Derived::show() is called.
  3. Final Answer:

    Derived -> Option A
  4. Quick Check:

    Virtual function calls Derived method [OK]
Hint: Virtual functions call derived version via base pointer [OK]
Common Mistakes:
  • Ignoring virtual keyword and expecting Base output
  • Confusing pointer type with object type
  • Assuming compilation or runtime error
4. What is wrong with this code snippet?
class Base {
public:
    void display() { std::cout << "Base"; }
};
class Derived : public Base {
public:
    void display() { std::cout << "Derived"; }
};

int main() {
    Base *ptr = new Derived();
    ptr->display();
    delete ptr;
    return 0;
}
medium
A. delete ptr causes memory leak
B. Pointer ptr cannot point to Derived object
C. Derived class must not redefine display()
D. display() should be declared virtual in Base for polymorphism

Solution

  1. Step 1: Check function overriding and polymorphism

    Without virtual, base class pointer calls base version even if pointing to derived object.
  2. Step 2: Identify missing virtual keyword

    To enable polymorphism, display() in Base must be declared virtual.
  3. Final Answer:

    display() should be declared virtual in Base for polymorphism -> Option D
  4. Quick Check:

    Missing virtual causes base method call [OK]
Hint: Declare base methods virtual for polymorphism [OK]
Common Mistakes:
  • Assuming pointer can't point to derived
  • Thinking delete causes leak here
  • Believing derived can't redefine base methods
5. You have a base class Animal with a virtual function sound(). Two derived classes Dog and Cat override sound(). You want to store multiple animals in an array and call sound() on each. Which approach correctly uses base class pointers to achieve this?
hard
A. Create an array of Animal objects and assign Dog and Cat objects directly
B. Create an array of Dog* and cast Cat* to Dog*
C. Create an array of Animal*, store new Dog() and new Cat(), then loop and call sound()
D. Use an array of void* pointers and cast to Animal* before calling sound()

Solution

  1. Step 1: Understand polymorphic storage

    To store different derived objects, use an array of base class pointers (Animal*).
  2. Step 2: Store derived objects via pointers

    Store new Dog() and new Cat() in the Animal* array, then call sound() polymorphically.
  3. Final Answer:

    Create an array of Animal*, store new Dog() and new Cat(), then loop and call sound() -> Option C
  4. Quick Check:

    Base pointer array + virtual functions = polymorphism [OK]
Hint: Use base class pointer array for polymorphic objects [OK]
Common Mistakes:
  • Using object array causes slicing
  • Casting unrelated pointers unsafely
  • Using void* loses type safety and polymorphism
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