#include <iostream>
struct A
{
int a_;
A(int a)
: a_(a)
{
}
virtual ~A()
{
}
};
struct B :
public A
{
int b_;
B(int a, int b)
: A(a)
, b_(b)
{
}
};
struct C :
public A
{
int c_;
C(int a, int c)
: A(a)
, c_(c)
{
}
};
struct D
{
int d_;
D()
: d_(0)
{
}
virtual int d()
{
return d_;
}
};
struct E :
public D,
public A
{
E()
: D()
, A(0)
{
}
};
template <class Base, class Derived>
bool is_differ(const Derived* der)
{
return (void*) der != (Base*) der;
}
int main()
{
A* a = new A(5);
B* b = new B(2, 3);
C* c = new C(1, 4);
E* e = new E();
std::cout << std::boolalpha;
std::cout << "A* and B* differ: " << is_differ<A, B>(b) << std::endl;
std::cout << "A* and C* differ: " << is_differ<A, C>(c) << std::endl;
std::cout << "A* and E* differ: " << is_differ<A, E>(e) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnN0cnVjdCBBCnsKCWludCBhXzsKIAoJQShpbnQgYSkKCQk6IGFfKGEpCgl7Cgl9CiAKCXZpcnR1YWwgfkEoKQoJewoJfQp9OwogCnN0cnVjdCBCIDoKCXB1YmxpYyBBCnsKCWludCBiXzsKIAoJQihpbnQgYSwgaW50IGIpCgkJOiBBKGEpCgkJLCBiXyhiKQoJewoJfQp9OwogCnN0cnVjdCBDIDoKCXB1YmxpYyBBCnsKCWludCBjXzsKIAoJQyhpbnQgYSwgaW50IGMpCgkJOiBBKGEpCgkJLCBjXyhjKQoJewoJfQp9OwogCnN0cnVjdCBECnsKCWludCBkXzsKCQoJRCgpCgkJOiBkXygwKQoJewoJfQoJCgl2aXJ0dWFsIGludCBkKCkKCXsKCQlyZXR1cm4gZF87Cgl9Cn07CgpzdHJ1Y3QgRSA6CglwdWJsaWMgRCwKCXB1YmxpYyBBCnsKCUUoKQoJCTogRCgpCgkJLCBBKDApCgl7Cgl9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgQmFzZSwgY2xhc3MgRGVyaXZlZD4KYm9vbCBpc19kaWZmZXIoY29uc3QgRGVyaXZlZCogZGVyKQp7CglyZXR1cm4gKHZvaWQqKSBkZXIgIT0gKEJhc2UqKSBkZXI7Cn0KIAppbnQgbWFpbigpCnsKCUEqIGEgPSBuZXcgQSg1KTsKCUIqIGIgPSBuZXcgQigyLCAzKTsKCUMqIGMgPSBuZXcgQygxLCA0KTsKCUUqIGUgPSBuZXcgRSgpOwoJCglzdGQ6OmNvdXQgPDwgc3RkOjpib29sYWxwaGE7CglzdGQ6OmNvdXQgPDwgIkEqIGFuZCBCKiBkaWZmZXI6ICIgPDwgaXNfZGlmZmVyPEEsIEI+KGIpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiQSogYW5kIEMqIGRpZmZlcjogIiA8PCBpc19kaWZmZXI8QSwgQz4oYykgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJBKiBhbmQgRSogZGlmZmVyOiAiIDw8IGlzX2RpZmZlcjxBLCBFPihlKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==