๐ Scenario: Imagine you are creating a simple program to manage different types of animals. Each animal can make a sound, but the sound depends on the specific animal type.
๐ฏ Goal: You will create a base class called Animal and two derived classes called Dog and Cat. Then, you will use a base class pointer to call the correct sound function for each animal.
๐ What You'll Learn
Create a base class Animal with a virtual function makeSound().
Create derived classes Dog and Cat that override makeSound().
Create a base class pointer to point to objects of Dog and Cat.
Use the base class pointer to call the makeSound() function and display the correct sound.
๐ก Why This Matters
๐ Real World
Base class pointers are used in programs to handle different types of objects in a uniform way, like managing different animals or shapes.
๐ผ Career
Understanding base class pointers and virtual functions is essential for object-oriented programming, which is widely used in software development jobs.
Progress0 / 4 steps
1
Create the base class Animal
Create a base class called Animal with a public virtual function makeSound() that prints "Some generic animal sound".
C++
Hint
Use class Animal and define virtual void makeSound() inside it. Use cout to print the sound.
2
Create derived classes Dog and Cat
Create two classes Dog and Cat that inherit from Animal. Override the makeSound() function in Dog to print "Woof!" and in Cat to print "Meow!".
C++
Hint
Use class Dog : public Animal and class Cat : public Animal. Override makeSound() in both classes.
3
Create base class pointers to Dog and Cat objects
Create two pointers of type Animal* called animal1 and animal2. Point animal1 to a new Dog object and animal2 to a new Cat object.
C++
Hint
Use Animal* animal1 = new Dog(); and Animal* animal2 = new Cat(); to create pointers.
4
Use base class pointers to call makeSound()
Use the pointers animal1 and animal2 to call the makeSound() function. Then, delete the objects to free memory.
C++
Hint
Call animal1->makeSound(); and animal2->makeSound();. Then use delete to free memory.
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
Step 1: Understand base and derived classes
A base class is a general class, and derived classes extend it with more features.
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.
Final Answer:
Point to objects of derived classes -> Option B
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
Step 1: Recall pointer declaration syntax
In C++, a pointer to a type is declared as Type *pointerName;.
Step 2: Apply to Base class
For class Base, the pointer declaration is Base *ptr;.
Final Answer:
Base *ptr; -> Option A
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
Step 1: Understand virtual function behavior
The show() function is virtual in Base, so calls use the actual object's method.
Step 2: Pointer points to Derived object
The pointer ptr points to a Derived object, so Derived::show() is called.
Final Answer:
Derived -> Option A
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
Step 1: Check function overriding and polymorphism
Without virtual, base class pointer calls base version even if pointing to derived object.
Step 2: Identify missing virtual keyword
To enable polymorphism, display() in Base must be declared virtual.
Final Answer:
display() should be declared virtual in Base for polymorphism -> Option D
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
Step 1: Understand polymorphic storage
To store different derived objects, use an array of base class pointers (Animal*).
Step 2: Store derived objects via pointers
Store new Dog() and new Cat() in the Animal* array, then call sound() polymorphically.
Final Answer:
Create an array of Animal*, store new Dog() and new Cat(), then loop and call sound() -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.