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 ho, to actual runtime type ka version run hota hai — zaroori nahi ki 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 bina, dono calls iske bajaye '...' print karte, kyunki 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 karo jiska ek virtual method name() "Shape" return kare. Ek class Circle define karo jo Shape se inherit kare aur name() ko override karke "Circle" return kare. Ek Shape* pointer ke through ek Circle banao aur uska name() print karo.