#include <iostream>
using namespace std;
struct Base
{
};
struct D1 : Base
{
};
struct D2 : Base
{
void bar() const
{
std::cout << "D2::bar" << std::endl;
}
};
struct D3 : D1, D2
{
};
Base const * foo(Base const * base)
{
return static_cast<D3::D2 const *>(
static_cast<D3 const *>(base));
}
int main()
{
D3 d3;
Base const *ptr = static_cast<D1 const *>(&d3);
Base const *res = foo(ptr);
static_cast<D2 const *>(res)->bar();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEJhc2UKewoJCn07CgpzdHJ1Y3QgRDEgOiBCYXNlCnsKCQp9OwpzdHJ1Y3QgRDIgOiBCYXNlCnsKCXZvaWQgYmFyKCkgY29uc3QKCXsKCQlzdGQ6OmNvdXQgPDwgIkQyOjpiYXIiIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCnN0cnVjdCBEMyA6IEQxLCBEMgp7CgkKfTsKCkJhc2UgY29uc3QgKiBmb28oQmFzZSBjb25zdCAqIGJhc2UpCnsKCXJldHVybiBzdGF0aWNfY2FzdDxEMzo6RDIgY29uc3QgKj4oCgkJc3RhdGljX2Nhc3Q8RDMgY29uc3QgKj4oYmFzZSkpOwp9CgoKaW50IG1haW4oKQp7CglEMyBkMzsKCUJhc2UgY29uc3QgKnB0ciA9IHN0YXRpY19jYXN0PEQxIGNvbnN0ICo+KCZkMyk7CglCYXNlIGNvbnN0ICpyZXMgPSBmb28ocHRyKTsKCXN0YXRpY19jYXN0PEQyIGNvbnN0ICo+KHJlcyktPmJhcigpOwp9