#include <iostream>
#include <vector>
 
struct parent
{
    virtual ~parent() = default;
    virtual void foo() = 0;
};
 
struct Child : parent
{
	Child(int n) : n(n) {}
    void foo() override { std::cout << n << std::endl; }
	int n;
};
 
class Grid{
public:
    Grid() : col(10), row(10), grid(col * row, nullptr) {}
 
    parent* operator() (std::size_t x, std::size_t y) const {
        if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
        return grid[y * col + x];
    }
 
    parent*& operator() (std::size_t x, std::size_t y) {
        if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
        return grid[y * col + x];
    }
 
private:
    int col;
    int row;
    std::vector<parent*> grid;
};
 
 
int main() {
	Grid b;
	Child c(1);
	Child c2(2);
 
	b(1,1) = &c;
	b(1,4) = &c2;
 
	b(1,1)->foo(); //calls the first Childs foo()
	b(1,4)->foo(); //calls the second Childs foo()
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IHBhcmVudAp7CiAgICB2aXJ0dWFsIH5wYXJlbnQoKSA9IGRlZmF1bHQ7CiAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwp9OwoKc3RydWN0IENoaWxkIDogcGFyZW50CnsKCUNoaWxkKGludCBuKSA6IG4obikge30KICAgIHZvaWQgZm9vKCkgb3ZlcnJpZGUgeyBzdGQ6OmNvdXQgPDwgbiA8PCBzdGQ6OmVuZGw7IH0KCWludCBuOwp9OwoKY2xhc3MgR3JpZHsKcHVibGljOgogICAgR3JpZCgpIDogY29sKDEwKSwgcm93KDEwKSwgZ3JpZChjb2wgKiByb3csIG51bGxwdHIpIHt9CgogICAgcGFyZW50KiBvcGVyYXRvcigpIChzdGQ6OnNpemVfdCB4LCBzdGQ6OnNpemVfdCB5KSBjb25zdCB7CiAgICAgICAgaWYgKGNvbCA8PSB4IHx8IHJvdyA8PSB5KSB7IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiSW52YWxpZCBhcmd1bWVudHMiKTsgfQogICAgICAgIHJldHVybiBncmlkW3kgKiBjb2wgKyB4XTsKICAgIH0KCiAgICBwYXJlbnQqJiBvcGVyYXRvcigpIChzdGQ6OnNpemVfdCB4LCBzdGQ6OnNpemVfdCB5KSB7CiAgICAgICAgaWYgKGNvbCA8PSB4IHx8IHJvdyA8PSB5KSB7IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiSW52YWxpZCBhcmd1bWVudHMiKTsgfQogICAgICAgIHJldHVybiBncmlkW3kgKiBjb2wgKyB4XTsKICAgIH0KCnByaXZhdGU6CiAgICBpbnQgY29sOwogICAgaW50IHJvdzsKICAgIHN0ZDo6dmVjdG9yPHBhcmVudCo+IGdyaWQ7Cn07CgoKaW50IG1haW4oKSB7CglHcmlkIGI7CglDaGlsZCBjKDEpOwoJQ2hpbGQgYzIoMik7CgkKCWIoMSwxKSA9ICZjOwoJYigxLDQpID0gJmMyOwoJCgliKDEsMSktPmZvbygpOyAvL2NhbGxzIHRoZSBmaXJzdCBDaGlsZHMgZm9vKCkKCWIoMSw0KS0+Zm9vKCk7IC8vY2FsbHMgdGhlIHNlY29uZCBDaGlsZHMgZm9vKCkKfQ==