#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;
}
I2luY2x1ZGUgPGNzdGRkZWY+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBJQ2VsbAp7Cgl2aXJ0dWFsIGJvb2wgaXNFbXRweSgpID0gMDsKfTsKCmNsYXNzIE15Q2VsbCA6IHB1YmxpYyBJQ2VsbAp7CglpbnQgdmFsdWU7CnB1YmxpYzoKCU15Q2VsbCgpIDp2YWx1ZSgwKQoJewoJfQoKCXZpcnR1YWwgYm9vbCBpc0VtdHB5KCkKCXsKCQlyZXR1cm4gdmFsdWUgPT0gMDsKCX0KfTsKCnZvaWQgZm9vKElDZWxsICpjZWxscywgc2l6ZV90IHN6KQp7CiAgICBzdGQ6OmNvdXQgPDwgIkJhc2UgYWRkcmVzcyAiIDw8ICZjZWxsc1sxXSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIkRlcml2ZWQgYWRkcmVzcyAiIDw8ICYoKE15Q2VsbCopY2VsbHMpWzFdIDw8IHN0ZDo6ZW5kbDsKLy8JY2VsbHNbMV0uaXNFbXRweSgpOyAvL0FjY2VzcyB2aW9sYXRpb24KICAgICgoTXlDZWxsKiljZWxscylbMV0uaXNFbXRweSgpOwp9CgppbnQgbWFpbigpCnsKCU15Q2VsbCAqbXlDZWxscyA9IG5ldyBNeUNlbGxbMTBdOwoJZm9vKG15Q2VsbHMsIDEwKTsKCWRlbGV0ZVtdIG15Q2VsbHM7CgoJcmV0dXJuIDA7Cn0=