← index
cplusplus17.Examples/features/polymorphism/dynamic-poly.cpp
Source: cplusplus17.Examples/features/polymorphism/dynamic-poly.cpp
#include<iostream>
#include<string>

class Life {
public:
    Life(std::string n) : name(n) {
    }
    virtual ~Life() {
        std::cout << "Life: " << name << " restarts..\n";
    }
    virtual void birth() = 0;
    virtual void death() = 0;
    virtual void say(std::string s) = 0;
    
    std::string getName() const { return name; }
private:
    std::string name;
    
};

class Ape : public Life {
public:
    Ape(std::string n) : Life(n) {
        birth();
    }
    ~Ape() override {
        death();
    }
    void birth() override {
        std::cout << "Ape was born...\n";
    }
    
    void death() override {
        std::cout << "Ape died...\n";
    }
    
    void say(std::string s) override {
        std::cout << "Ape says: " << s << "\n";
    }
};

class Human : public Life {
public:
    Human(std::string n) : Life(n) {
        birth();
    }
    ~Human() override {
        death();
    }
    void birth() override {
        std::cout << "Human was born...\n";
    }
    
    void death() override {
        std::cout << "Human died...\n";
    }
    
    void say(std::string s) override {
        std::cout << "Human says: " << s << "\n";
    }
};

class Alien : public Life {
public:
    Alien(std::string n) : Life(n) {
        birth();
    }
    ~Alien() override {
        death();
    }
    void birth() override {
        std::cout << "Alien was born...\n";
    }
    void death() override {
        std::cout << "Alien died...\n";
    }
    void say(std::string s) override {
        std::cout << "Alien says: " << s << "\n";
    }
};

void SayHello(Life *life) {
    life->say("Hello World!");
}

bool Compare(Life *life1, Life *life2) {
    if(life1->getName() == life2->getName()) return true;
    return false;
}

int main() {
    Human jared("jared");
    Alien grey("grey");
    Ape ceaser("ceaser");
    SayHello(&jared);
    SayHello(&grey);
    SayHello(&ceaser);
    if(Compare(&jared, &ceaser) == true) {
        std::cout << "Comparision true...\n";
    } else {
        std::cout << "Comparision false...\n";
    }
    return 0;
}