AnyCompiler

Inheritance aur Polymorphism

Ek class : public Base se doosri class se inherit kar sakta hai. Ek base class method ko virtual mark karna, aur derived class ke version ko override, compiler ko dynamically dispatch karne ko kehta hai: jab aap method ko ek base class pointer ya reference ke through call karte hain, to actual runtime type ka version chalta hai — zaroori nahi ke wahi jo static type suggest karega.

#include <iostream>
#include <string>
using namespace std;

class Animal {
public:
    virtual string speak() const {
        return "...";
    }
};

class Dog : public Animal {
public:
    string speak() const override {
        return "Woof!";
    }
};

class Cat : public Animal {
public:
    string speak() const override {
        return "Meow!";
    }
};

int main() {
    Dog dog;
    Cat cat;
    Animal* animals[2] = { &dog, &cat };

    for (int i = 0; i < 2; i++) {
        cout << animals[i]->speak() << endl;
    }
    return 0;
}
Output
Woof!
Meow!

animals, Animal* ka ek array hai — ek statically typed base-class pointer — lekin har element phir bhi sahi derived class ka speak() call karta hai. virtual ke baghair, dono calls iske bajaye '...' print karte, kyunke compiler call ko declared Animal type ke against statically resolve karta, runtime par dispatch karne ke bajaye.

Aage: operator overloading — apne khud ke types ko wahi +, -, == syntax dena jo built-in types ke paas pehle se hai.

Practice exercise

Ek class Shape define karein jiska ek virtual method name() "Shape" wapas kare. Ek class Circle define karein jo Shape se inherit kare aur name() ko override kar ke "Circle" wapas kare. Ek Shape* pointer ke through ek Circle banayein aur uska name() print karein.