#include <cstddef>
#include <iostream>

struct ICell
{
	virtual bool isEmtpy() = 0;
};

class MyCell : public ICell
{
	int value;
public:
	MyCell() :value(0)
	{
	}

	virtual bool isEmtpy()
	{
		return value == 0;
	}
};

void foo(ICell *cells, size_t sz)
{
    std::cout << "Base address " << &cells[1] << std::endl;
    std::cout << "Derived address " << &((MyCell*)cells)[1] << std::endl;
//	cells[1].isEmtpy(); //Access violation
    ((MyCell*)cells)[1].isEmtpy();
}

int main()
{
	MyCell *myCells = new MyCell[10];
	foo(myCells, 10);
	delete[] myCells;

	return 0;
}