#include <iostream>
struct Foo { virtual const char * who() = 0; };
struct Bar : Foo { virtual const char * who() { return "Bar"; } };
struct Baz : Foo { virtual const char * who() { return "Baz"; } };
struct Qux : Bar, Baz { };
int main()
{
Qux * qux = new Qux();
// Foo * foo = qux; // compile-time error, ambiguous
Bar * bar = qux;
Foo * foo = bar;
std::cout << static_cast<Baz *>(foo)->who() << " at "
<< static_cast<Baz *>(foo) << "\n";
std::cout << dynamic_cast<Baz *>(foo)->who() << " at "
<< dynamic_cast<Baz *>(foo) << "\n";
delete qux;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEZvbyB7IHZpcnR1YWwgY29uc3QgY2hhciAqIHdobygpID0gMDsgfTsKc3RydWN0IEJhciA6IEZvbyB7IHZpcnR1YWwgY29uc3QgY2hhciAqIHdobygpIHsgcmV0dXJuICJCYXIiOyB9IH07CnN0cnVjdCBCYXogOiBGb28geyB2aXJ0dWFsIGNvbnN0IGNoYXIgKiB3aG8oKSB7IHJldHVybiAiQmF6IjsgfSB9OwpzdHJ1Y3QgUXV4IDogQmFyLCBCYXogeyB9OwoKaW50IG1haW4oKQp7CiAgICBRdXggKiBxdXggPSBuZXcgUXV4KCk7CiAgICAvLyBGb28gKiBmb28gPSBxdXg7IC8vIGNvbXBpbGUtdGltZSBlcnJvciwgYW1iaWd1b3VzCiAgICBCYXIgKiBiYXIgPSBxdXg7CiAgICBGb28gKiBmb28gPSBiYXI7CgogICAgc3RkOjpjb3V0IDw8IHN0YXRpY19jYXN0PEJheiAqPihmb28pLT53aG8oKSA8PCAiIGF0ICIKICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxCYXogKj4oZm9vKSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IGR5bmFtaWNfY2FzdDxCYXogKj4oZm9vKS0+d2hvKCkgPDwgIiBhdCAiCiAgICAgICAgICAgICAgPDwgZHluYW1pY19jYXN0PEJheiAqPihmb28pIDw8ICJcbiI7CgogICAgZGVsZXRlIHF1eDsKICAgIHJldHVybiAwOwp9Cg==