Abstract Classes and Pure Virtual Functions
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 को यह देना होगा":
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 नहीं कर सकते
// Shape s; // ERROR: abstract object nahi bana sakte Shape *p; // OK: Shape ka pointer theek hai
आप फिर भी Shape* pointers या references इस्तेमाल कर सकते हैं — वे concrete subclasses पर इशारा करते हैं।
एक चलता उदाहरण
#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;
}12.5664
12
हर shape अपना area गिनता है, Shape* के ज़रिए एक समान call किया गया।
Interfaces के रूप में abstract classes
C++ में interface बस एक abstract class है जहाँ सभी functions pure virtual हों और कोई data न हो। यह एक शुद्ध अनुबंध परिभाषित करता है:
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 क्या है?
C++ में pure virtual function क्या है?
= 0 लिखकर घोषित, जैसे virtual double area() = 0;। यह हर concrete derived class को अपना version देने पर मजबूर करता है, और इसकी मौजूदगी class को abstract बनाती है।