Base and derived classes help organize code by sharing common features and adding new ones. This makes programs easier to build and understand.
When you want to create a general template for objects and then make specific versions.
When many objects share some behavior but also have unique features.
When you want to reuse code to avoid repeating the same parts.
When modeling real-world things that have common traits but differ in details.
When you want to improve your program step-by-step by adding new features.
Syntax
C++
class BaseClass {
public:
// Base class members
};
class DerivedClass : public BaseClass {
public:
// Additional members
};
The DerivedClass inherits from BaseClass using : public BaseClass.
Public inheritance means the derived class keeps the base class's public members accessible.
Examples
Here, Dog inherits eat() from Animal and adds bark().
C++
#include <iostream>
class Animal {
public:
void eat() {
std::cout << "Eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << "Barking" << std::endl;
}
};
Car is a Vehicle and can start() and honk().
C++
#include <iostream>
class Vehicle {
public:
void start() {
std::cout << "Vehicle started" << std::endl;
}
};
class Car : public Vehicle {
public:
void honk() {
std::cout << "Car honks" << std::endl;
}
};
Sample Program
This program shows a Student using a greeting from Person and its own study() method.
C++
#include <iostream>
class Person {
public:
void greet() {
std::cout << "Hello!" << std::endl;
}
};
class Student : public Person {
public:
void study() {
std::cout << "Studying" << std::endl;
}
};
int main() {
Student s;
s.greet(); // From base class
s.study(); // From derived classreturn0;
}
OutputSuccess
Important Notes
Derived classes get all public and protected members from the base class.
Private members of the base class are not accessible directly in the derived class.
Use public inheritance to keep base class interface visible.
Summary
Base classes hold common features.
Derived classes add or change features.
This helps organize and reuse code easily.
Practice
(1/5)
1. What is the main purpose of a base class in C++?
easy
A. To store only private data members
B. To create objects directly without inheritance
C. To override functions in derived classes
D. To hold common features shared by derived classes
Solution
Step 1: Understand base class role
A base class is designed to hold common features that multiple derived classes can share.
Step 2: Compare options
To hold common features shared by derived classes correctly states the purpose. Other options describe derived class behavior or incorrect roles.
Final Answer:
To hold common features shared by derived classes -> Option D
Quick Check:
Base class = common features [OK]
Hint: Base class holds shared features for reuse [OK]
Common Mistakes:
Confusing base class with derived class
Thinking base class cannot have data members
Assuming base class is only for private data
2. Which of the following is the correct syntax to declare a derived class Car inheriting from base class Vehicle in C++?
easy
A. class Car : Vehicle {};
B. class Car : public Vehicle {};
C. class Car extends Vehicle {};
D. class Car inherits Vehicle {};
Solution
Step 1: Recall C++ inheritance syntax
In C++, a derived class inherits from a base class using a colon and access specifier like public.
Step 2: Check options
class Car : public Vehicle {}; uses correct syntax: class Car : public Vehicle {}. Others use incorrect keywords or omit access specifier.
Hint: Use colon and public keyword for inheritance [OK]
Common Mistakes:
Omitting access specifier like public
Using wrong keywords like inherits or extends
Forgetting colon before base class name
3. What will be the output of this C++ code?
class Base {
public:
void show() { std::cout << "Base"; }
};
class Derived : public Base {
public:
void show() { std::cout << "Derived"; }
};
int main() {
Derived d;
d.show();
return 0;
}
medium
A. Derived
B. Base
C. Compilation error
D. No output
Solution
Step 1: Understand method overriding in derived class
The derived class Derived has its own show() method which hides the base class method.
Step 2: Check which method is called
Calling d.show() on a Derived object calls the derived class method, printing "Derived".
Final Answer:
Derived -> Option A
Quick Check:
Derived method overrides base method [OK]
Hint: Derived class method hides base method if same name [OK]
Common Mistakes:
Assuming base class method runs without virtual keyword
Expecting compilation error due to method name clash
Thinking both outputs print
4. Identify the error in 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();
return 0;
}
medium
A. Missing virtual keyword in base class method
B. Incorrect pointer type for inheritance
C. Derived class method should be static
D. No error, code runs fine
Solution
Step 1: Understand polymorphism with base pointers
Calling display() via a base class pointer calls base method unless it is virtual.
Step 2: Check for virtual keyword
The base class method display() lacks virtual, so ptr->display() calls base version, not derived.
Final Answer:
Missing virtual keyword in base class method -> Option A
Quick Check:
Virtual needed for polymorphic calls [OK]
Hint: Add virtual to base method for polymorphism [OK]
Common Mistakes:
Thinking pointer type is wrong
Believing derived method runs without virtual
Assuming static keyword fixes this
5. Given these classes:
class Animal {
public:
virtual std::string sound() { return "Unknown"; }
};
class Dog : public Animal {
public:
std::string sound() override { return "Bark"; }
};
class Cat : public Animal {
public:
std::string sound() override { return "Meow"; }
};
Which code snippet correctly creates a list of animals and prints their sounds?
hard
A. std::vector<Animal> animals = {Dog(), Cat()}; for(auto& a : animals) std::cout << a.sound() << ' ';
B. std::vector<Dog> animals = {Dog(), Cat()}; for(auto& a : animals) std::cout << a.sound() << ' ';
C. std::vector animals = {new Dog(), new Cat()}; for(auto a : animals) std::cout << a->sound() << ' ';
D. std::vector<Animal> animals = {Dog(), Cat()}; for(auto a : animals) std::cout << a.sound() << ' ';
Solution
Step 1: Understand polymorphism with collections
To preserve derived class behavior, store pointers to base class, not objects by value.
Step 2: Analyze options
std::vector animals = {new Dog(), new Cat()}; for(auto a : animals) std::cout << a->sound() << ' '; uses std::vector<Animal*> with pointers to Dog and Cat, calling sound() polymorphically.
Final Answer:
std::vector<Animal*> animals = {new Dog(), new Cat()}; for(auto a : animals) std::cout << a->sound() << ' '; -> Option C
Quick Check:
Use base class pointers for polymorphic containers [OK]
Hint: Use base class pointers to keep derived behavior [OK]
Common Mistakes:
Storing objects by value causes slicing
Using wrong container type for polymorphism
Forgetting to use pointers or references
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.