Giter VIP home page Giter VIP logo

polymorphism's Introduction

Polymorphism


by: Cxx
#include <iostream>

#include <utility>
#include <memory>

// Interface

struct vtable {
    int  (*get_x  ) (void* This);
    int  (*get_y  ) (void* This);
    int  (*get_z  ) (void* This);

    void (*deleter) (void* This);
};

template <class type>
vtable const get_instance_of = {
    [](void* This) { return ((type*) This)->get_x(); },
    [](void* This) { return ((type*) This)->get_y(); },
    [](void* This) { return ((type*) This)->get_z(); },
    [](void* This) { delete ((type*) This); }
};

struct base {
    vtable const * caller;
    void* This;

    template <class type>
    base(type object)
        : This(new type(std::move(object))), caller(&get_instance_of <type>) {}

    base(base &&object)
        : This(std::exchange(object.This, nullptr)), caller(std::exchange(object.caller, nullptr)) {}

    decltype(auto) get_x() const { return caller->get_x(This); }
    decltype(auto) get_y() const { return caller->get_y(This); }
    decltype(auto) get_z() const { return caller->get_z(This); }

    ~base() {
        if (This) {
            caller->deleter(This);
        }
    }
};

// ~Interface

// Impl

struct point {
    int get_x() const { return *x * 3; }
    int get_y() const { return *y * 2; }
    int get_z() const { return *z * 4; }

    std::unique_ptr <int> x, y, z;

    point(int x, int y, int z) : x(new int(x)), y(new int(y)), z(new int(z)) {}
    point(int val) : point(val, val, val) {}

    point(point&& point_m) : x(std::move(point_m.x)), y(std::move(point_m.y)), z(std::move(point_m.z)) {}

    ~point() {
        x.reset(nullptr);
        y.reset(nullptr);
        z.reset(nullptr);
    }
};

// ~Impl

// Main

int main() {
    base element0(point{ 1, 2, 3 });
    base element1(std::move(element0));

    std::cout << element1.get_x() << '\n';
    std::cout << element1.get_y() << '\n';
    std::cout << element1.get_z() << '\n';
    return 0;
}

// ~Main

polymorphism's People

Contributors

cxx-mlr avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.