#include <iostream>
#include <vector>

class A {
public:
    virtual void talk() { printf("A\n"); }
};

class B: public A {
public:
    virtual void talk() override { printf("B\n"); }
};

int main(void) {
    std::vector<A> vec;
    std::vector<A*> vec2;
    A a;
    B b;
    a.talk();
    b.talk();

    std::cout << "---------------" << std::endl;
    std::cout << "Will always output 'A' as slicing occurs:" << std::endl;

    vec.push_back(a);
    vec.push_back(b);
    vec2.push_back(&a);
    vec2.push_back(&b);

    for (auto& c : vec) {
        c.talk();
    }

    std::cout << "---------------" << std::endl;
    std::cout << "Will make polymorphic call if 'virtual' specifier is enabled:" << std::endl;

    for (auto& c : vec2) {
        c->talk();
    }

}