cpp
examples
examples.cpp⚙️cpp
/**
* Abstract Classes - Examples
* Compile: g++ -std=c++17 -Wall examples.cpp -o examples
*/
#include <iostream>
#include <string>
#include <vector>
#include <memory>
using namespace std;
// ============================================================
// SECTION 1: BASIC ABSTRACT CLASS
// ============================================================
class Shape {
public:
virtual double area() const = 0;
virtual void draw() const = 0;
virtual ~Shape() = default;
};
class Circle : public Shape {
double radius;
public:
Circle(double r) : radius(r) {}
double area() const override { return 3.14159 * radius * radius; }
void draw() const override { cout << " Circle(r=" << radius << ")" << endl; }
};
class Rectangle : public Shape {
double w, h;
public:
Rectangle(double w, double h) : w(w), h(h) {}
double area() const override { return w * h; }
void draw() const override { cout << " Rectangle(" << w << "x" << h << ")" << endl; }
};
void demoBasic() {
cout << "--- Basic Abstract Class ---\n" << endl;
vector<unique_ptr<Shape>> shapes;
shapes.push_back(make_unique<Circle>(5));
shapes.push_back(make_unique<Rectangle>(4, 3));
for (const auto& s : shapes) {
s->draw();
cout << " Area: " << s->area() << endl;
}
}
// ============================================================
// SECTION 2: INTERFACE PATTERN
// ============================================================
class ISerializable {
public:
virtual string serialize() const = 0;
virtual void deserialize(const string& data) = 0;
virtual ~ISerializable() = default;
};
class IPrintable {
public:
virtual void print() const = 0;
virtual ~IPrintable() = default;
};
class Document : public ISerializable, public IPrintable {
string title, content;
public:
Document(const string& t, const string& c) : title(t), content(c) {}
string serialize() const override {
return title + "|" + content;
}
void deserialize(const string& data) override {
size_t pos = data.find('|');
title = data.substr(0, pos);
content = data.substr(pos + 1);
}
void print() const override {
cout << " " << title << ": " << content << endl;
}
};
void demoInterface() {
cout << "\n--- Interface Pattern ---\n" << endl;
Document doc("Report", "Q4 Results");
doc.print();
cout << " Serialized: " << doc.serialize() << endl;
}
// ============================================================
// SECTION 3: PARTIAL IMPLEMENTATION
// ============================================================
class Logger {
public:
virtual void log(const string& msg) = 0;
void info(const string& msg) { log("[INFO] " + msg); }
void warn(const string& msg) { log("[WARN] " + msg); }
void error(const string& msg) { log("[ERROR] " + msg); }
virtual ~Logger() = default;
};
class ConsoleLogger : public Logger {
public:
void log(const string& msg) override {
cout << " " << msg << endl;
}
};
void demoPartial() {
cout << "\n--- Partial Implementation ---\n" << endl;
ConsoleLogger logger;
logger.info("Application started");
logger.warn("Low memory");
logger.error("Connection failed");
}
// ============================================================
// SECTION 4: PURE VIRTUAL WITH BODY
// ============================================================
class Validator {
public:
virtual bool validate(const string& data) = 0;
virtual ~Validator() = default;
};
bool Validator::validate(const string& data) {
return !data.empty(); // Default: just check non-empty
}
class EmailValidator : public Validator {
public:
bool validate(const string& data) override {
if (!Validator::validate(data)) return false;
return data.find('@') != string::npos;
}
};
void demoPureWithBody() {
cout << "\n--- Pure Virtual with Body ---\n" << endl;
EmailValidator ev;
cout << " 'test@email.com' valid: " << (ev.validate("test@email.com") ? "yes" : "no") << endl;
cout << " 'invalid' valid: " << (ev.validate("invalid") ? "yes" : "no") << endl;
cout << " '' valid: " << (ev.validate("") ? "yes" : "no") << endl;
}
// ============================================================
// SECTION 5: ABSTRACT FACTORY PATTERN
// ============================================================
class Button {
public:
virtual void render() const = 0;
virtual ~Button() = default;
};
class WindowsButton : public Button {
public:
void render() const override { cout << " [Windows Button]" << endl; }
};
class MacButton : public Button {
public:
void render() const override { cout << " [Mac Button]" << endl; }
};
class GUIFactory {
public:
virtual unique_ptr<Button> createButton() = 0;
virtual ~GUIFactory() = default;
};
class WindowsFactory : public GUIFactory {
public:
unique_ptr<Button> createButton() override {
return make_unique<WindowsButton>();
}
};
class MacFactory : public GUIFactory {
public:
unique_ptr<Button> createButton() override {
return make_unique<MacButton>();
}
};
void demoAbstractFactory() {
cout << "\n--- Abstract Factory ---\n" << endl;
unique_ptr<GUIFactory> factory = make_unique<WindowsFactory>();
auto btn = factory->createButton();
btn->render();
factory = make_unique<MacFactory>();
btn = factory->createButton();
btn->render();
}
// ============================================================
// MAIN
// ============================================================
int main() {
cout << "╔══════════════════════════════════════╗" << endl;
cout << "║ ABSTRACT CLASSES - EXAMPLES ║" << endl;
cout << "╚══════════════════════════════════════╝" << endl;
demoBasic();
demoInterface();
demoPartial();
demoPureWithBody();
demoAbstractFactory();
cout << "\n=== Complete ===" << endl;
return 0;
}