#include <iostream>
using namespace std;

// Base class: shape
class Shape {
public:
    // Virtual function: draw shape
    virtual void draw() const {
        cout << "Draw generic shape" << endl;
    }

    // Regular member function (non-virtual), for comparison
    void info() const {
        cout << "This is a shape" << endl;
    }

    virtual ~Shape() {} // Virtual destructor, ensures derived class objects are properly destroyed
};

// Derived class: Circle
class Circle : public Shape {
public:
    // Override base class virtual function
    void draw() const override {
        cout << "Draw a circle" << endl;
    }

    void info() const {
        cout << "This is a circle" << endl;
    }
};

// Derived class: Rectangle
class Rectangle : public Shape {
public:
    void draw() const override {
        cout << "Draw a rectangle" << endl;
    }

    void info() const {
        cout << "This is a rectangle" << endl;
    }
};

int main() {
    // Array of base class pointers pointing to derived class objects
    Shape* shapes[2];
    shapes[0] = new Circle();
    shapes[1] = new Rectangle();

    // Call virtual functions through base class pointers - dynamic polymorphism
    for (int i = 0; i < 2; ++i) {
        shapes[i]->draw();   // Virtual function call
        shapes[i]->info();   // Non-virtual function call (determined by pointer type)
        cout << "-------------------" << endl;
    }

    // Release memory
    for (int i = 0; i < 2; ++i) {
        delete shapes[i];
    }

    return 0;
}

results matching ""

    No results matching ""