Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
🟣 OOP  ·  Lesson 49

Abstract Classes and Pure Virtual Functions

Written and reviewed by · Senior IT Faculty · 15+ years’ experience

What is an abstract class?

An abstract class is a class you cannot make objects of directly — it exists only to be inherited. It sets out a common interface (what derived classes must do) by declaring one or more pure virtual functions, and may also supply shared code.

Pure virtual functions

A pure virtual function is a virtual function with no body in the base, marked with = 0. It says "every concrete subclass must provide this":

C++
class Shape {
public:
    virtual double area() = 0;   // pure virtual → Shape is abstract
    virtual ~Shape() {}          // virtual destructor
};

The single = 0 makes Shape abstract. For the syntax details of pure virtual, see the pure virtual & abstract syntax page.

You cannot instantiate it

C++
// Shape s;        // ERROR: cannot create an abstract object
Shape *p;           // OK: a pointer to Shape is fine

You can still use Shape* pointers or references — they point to concrete subclasses.

A worked example

C++
#include <iostream>
using namespace std;
class Shape {
public:
    virtual double area() = 0;      // pure virtual
    virtual ~Shape() {}
};
class Circle : public Shape {
    double r;
public:
    Circle(double x) : r(x) {}
    double area() override { return 3.14159 * r * r; }
};
class Rectangle : public Shape {
    double w, h;
public:
    Rectangle(double a, double b) : w(a), h(b) {}
    double area() override { return w * h; }
};
int main() {
    Shape *shapes[2] = { new Circle(2), new Rectangle(3, 4) };
    for (Shape *s : shapes) cout << s->area() << "\n";
    return 0;
}
Output:
12.5664
12

Each shape computes its own area, called uniformly through Shape*.

Abstract classes as interfaces

An interface in C++ is just an abstract class where all functions are pure virtual and there is no data. It defines a pure contract:

C++
class Drawable {
public:
    virtual void draw() = 0;
    virtual ~Drawable() {}
};   // any class implementing draw() is "Drawable"

Key rules

  • A class with any pure virtual function is abstract.
  • An abstract class cannot be instantiated, but pointers/references to it can.
  • A derived class stays abstract until it overrides all pure virtuals.
  • Always give an abstract base a virtual destructor.

Common mistakes

  • Trying to create an object of an abstract class.
  • Leaving a pure virtual unimplemented in a class you meant to be concrete.
  • Forgetting the virtual destructor in the abstract base.
  • Confusing an abstract class (may have data/implemented methods) with a pure interface.
🏋️ Practice

Define an abstract Animal with a pure virtual sound(). Derive Dog and Cow, implement sound() in each, and call them through an array of Animal*.

Summary

  • An abstract class has at least one pure virtual function.
  • Pure virtual is written = 0 and has no base body.
  • You cannot instantiate an abstract class, only point to it.
  • An interface is an abstract class with all-pure-virtual and no data.
  • A subclass must override every pure virtual to become concrete.

Abstract class क्या है?

Abstract class ऐसी class है जिसके objects आप सीधे नहीं बना सकते — यह केवल inherit होने को होती है। यह एक या ज़्यादा pure virtual functions घोषित करके एक साझा interface (derived classes को क्या करना है) तय करती है, और साझा code भी दे सकती है।

Pure virtual functions

Pure virtual function एक virtual function है जिसका base में कोई body नहीं, = 0 से चिह्नित। यह कहता है "हर concrete subclass को यह देना होगा":

C++
class Shape {
public:
    virtual double area() = 0;   // pure virtual → Shape abstract hai
    virtual ~Shape() {}          // virtual destructor
};

अकेला = 0 Shape को abstract बनाता है। Pure virtual के syntax विवरण के लिए, pure virtual & abstract syntax page देखें।

आप इसे instantiate नहीं कर सकते

C++
// Shape s;        // ERROR: abstract object nahi bana sakte
Shape *p;           // OK: Shape ka pointer theek hai

आप फिर भी Shape* pointers या references इस्तेमाल कर सकते हैं — वे concrete subclasses पर इशारा करते हैं।

एक चलता उदाहरण

C++
#include <iostream>
using namespace std;
class Shape {
public:
    virtual double area() = 0;      // pure virtual
    virtual ~Shape() {}
};
class Circle : public Shape {
    double r;
public:
    Circle(double x) : r(x) {}
    double area() override { return 3.14159 * r * r; }
};
class Rectangle : public Shape {
    double w, h;
public:
    Rectangle(double a, double b) : w(a), h(b) {}
    double area() override { return w * h; }
};
int main() {
    Shape *shapes[2] = { new Circle(2), new Rectangle(3, 4) };
    for (Shape *s : shapes) cout << s->area() << "\n";
    return 0;
}
Output:
12.5664
12

हर shape अपना area गिनता है, Shape* के ज़रिए एक समान call किया गया।

Interfaces के रूप में abstract classes

C++ में interface बस एक abstract class है जहाँ सभी functions pure virtual हों और कोई data न हो। यह एक शुद्ध अनुबंध परिभाषित करता है:

C++
class Drawable {
public:
    virtual void draw() = 0;
    virtual ~Drawable() {}
};   // draw() implement karne wali koi bhi class "Drawable" hai

मुख्य नियम

  • किसी भी pure virtual function वाली class abstract है।
  • Abstract class instantiate नहीं हो सकती, पर इसके pointers/references हो सकते हैं।
  • Derived class तब तक abstract रहती है जब तक वह सभी pure virtuals override न करे।
  • Abstract base को हमेशा virtual destructor दें।

आम गलतियाँ

  • Abstract class का object बनाने की कोशिश।
  • जिस class को concrete बनाना था उसमें pure virtual बिना implementation छोड़ना।
  • Abstract base में virtual destructor भूलना।
  • Abstract class (data/implemented methods हो सकते) को शुद्ध interface से भ्रमित करना।
🏋️ अभ्यास

एक abstract Animal परिभाषित करें जिसमें pure virtual sound() हो। Dog और Cow derive करें, हर एक में sound() implement करें, और Animal* के array के ज़रिए call करें।

सारांश

  • Abstract class में कम से कम एक pure virtual function होता है।
  • Pure virtual = 0 लिखा जाता है और इसका base body नहीं होता।
  • आप abstract class instantiate नहीं कर सकते, केवल इस पर इशारा कर सकते हैं।
  • Interface एक abstract class है जिसमें सब pure-virtual और कोई data न हो।
  • Subclass को concrete बनने को हर pure virtual override करना होगा।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C++ में abstract class क्या है?
Abstract class ऐसी class है जिसमें कम से कम एक pure virtual function हो और इसलिए इसे अपने आप instantiate नहीं किया जा सकता। यह base class बनने को होती है, एक साझा interface परिभाषित करते हुए जिसे derived classes को implement करना होगा, जबकि संभवतः कुछ साझा व्यवहार भी देते हुए।
C++ में pure virtual function क्या है?
Pure virtual function एक virtual function है जिसका base class में कोई implementation नहीं, = 0 लिखकर घोषित, जैसे virtual double area() = 0;। यह हर concrete derived class को अपना version देने पर मजबूर करता है, और इसकी मौजूदगी class को abstract बनाती है।
C++ में आप abstract class का object क्यों नहीं बना सकते?
क्योंकि abstract class में कम से कम एक function बिना implementation के होता है, compiler इससे पूर्ण, उपयोगी object नहीं बना सकता। आप फिर भी abstract type के pointers या references इस्तेमाल कर सकते हैं, जो concrete derived classes के objects पर इशारा करते हैं।
C++ में abstract class और interface में क्या अंतर है?
C++ में कोई अलग interface keyword नहीं; interface बस एक abstract class है जहाँ हर function pure virtual हो और कोई data न हो। सामान्य abstract class अपने pure virtual के साथ implemented functions और data members भी शामिल कर सकती है।
C++ में अगर derived class सभी pure virtual functions override न करे तो क्या होता है?
अगर derived class किसी inherited pure virtual function को बिना implementation छोड़े, वह derived class खुद abstract है और इसे भी instantiate नहीं किया जा सकता। केवल तब जब हर pure virtual function implement हो, class concrete और उपयोगी बनती है।
← Back to C++ Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.