#include <iostream>
template <class Dest, class Src>
Dest force_cast(Src src)
{
union
{
Dest d;
Src s;
} convertor;
convertor.s = src;
return convertor.d;
}
class ABase {
virtual void bind() = 0;
};
class B;
class A
: public ABase {
public:
// int a, b;
class Unknown{};
typedef int(A::*Function)();
void bindFunction(void* f) {
this->f = force_cast<Function>(f);
}
int call() {
return (this->*f)();
}
Function f;
};
class B {
private:
int answer;
public:
B(int value) : answer(value) {}
// int c, d;
int getValue() { return answer; }
};
class Combined
: public A, public B {
public:
Combined(int value) : B(value), A() {}
virtual void /*A::*/bind() /* override */ {
A::bindFunction( force_cast<void*>( &Combined::getValue ) );
}
};
int main() {
Combined c(42);
c.bind();
std::cout << "The answer to Life, The Universe and Everything is " << c.call() << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIERlc3QsIGNsYXNzIFNyYz4KRGVzdCBmb3JjZV9jYXN0KFNyYyBzcmMpCnsKCXVuaW9uCgl7CgkJRGVzdCBkOwoJCVNyYyBzOwoJfSBjb252ZXJ0b3I7Cgljb252ZXJ0b3IucyA9IHNyYzsKCXJldHVybiBjb252ZXJ0b3IuZDsKfQoKY2xhc3MgQUJhc2UgewoJdmlydHVhbCB2b2lkIGJpbmQoKSA9IDA7Cn07CgpjbGFzcyBCOwoKY2xhc3MgQQogIDogcHVibGljIEFCYXNlIHsKcHVibGljOgoJLy8gaW50IGEsIGI7CgkKCWNsYXNzIFVua25vd257fTsKCXR5cGVkZWYgaW50KEE6OipGdW5jdGlvbikoKTsKCQoJdm9pZCBiaW5kRnVuY3Rpb24odm9pZCogZikgeyAKCQl0aGlzLT5mID0gZm9yY2VfY2FzdDxGdW5jdGlvbj4oZik7CQoJfQoJCglpbnQgY2FsbCgpIHsKCQlyZXR1cm4gKHRoaXMtPipmKSgpOwoJfQoJCglGdW5jdGlvbiBmOwp9OwoKY2xhc3MgQiB7CnByaXZhdGU6IAoJaW50IGFuc3dlcjsKcHVibGljOgoJQihpbnQgdmFsdWUpIDogYW5zd2VyKHZhbHVlKSB7fQoJCgkvLyBpbnQgYywgZDsKCWludCBnZXRWYWx1ZSgpIHsgcmV0dXJuIGFuc3dlcjsgfQp9OwoKY2xhc3MgQ29tYmluZWQKIDogcHVibGljIEEsIHB1YmxpYyBCIHsKcHVibGljOiAJCglDb21iaW5lZChpbnQgdmFsdWUpIDogQih2YWx1ZSksIEEoKSB7fQoJCgl2aXJ0dWFsIHZvaWQgLypBOjoqL2JpbmQoKSAvKiBvdmVycmlkZSAqLyB7CgkJQTo6YmluZEZ1bmN0aW9uKCBmb3JjZV9jYXN0PHZvaWQqPiggJkNvbWJpbmVkOjpnZXRWYWx1ZSApICk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCUNvbWJpbmVkIGMoNDIpOwoJYy5iaW5kKCk7CglzdGQ6OmNvdXQgPDwgIlRoZSBhbnN3ZXIgdG8gTGlmZSwgVGhlIFVuaXZlcnNlIGFuZCBFdmVyeXRoaW5nIGlzICIgPDwgYy5jYWxsKCkgPDwgIlxuIjsKCXJldHVybiAwOwp9