struct A {};
struct D { virtual void f()=0; /* g, e, ...*/ };
struct B: public A,D { void f(){}; /* g, e, ...*/ };
struct C: public A,D { void f(){};/* g, e, ...*/ };
template <typename T>
A* prepare(T* t)
{
t->f();
// g()
// e()
return t;
}
int main()
{
bool isC = true;
A *a = isC ? prepare(new B()) : prepare(new C());
}
c3RydWN0IEEge307CnN0cnVjdCBEIHsgdmlydHVhbCB2b2lkIGYoKT0wOyAvKiBnLCBlLCAuLi4qLyB9OwpzdHJ1Y3QgQjogcHVibGljIEEsRCB7IHZvaWQgZigpe307IC8qIGcsIGUsIC4uLiovIH07CnN0cnVjdCBDOiBwdWJsaWMgQSxEIHsgdm9pZCBmKCl7fTsvKiBnLCBlLCAuLi4qLyB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkEqIHByZXBhcmUoVCogdCkKewogIHQtPmYoKTsKICAvLyBnKCkKICAvLyBlKCkKICByZXR1cm4gdDsKfQoKaW50IG1haW4oKQp7CiAgYm9vbCBpc0MgPSB0cnVlOwogIEEgKmEgPSBpc0MgPyBwcmVwYXJlKG5ldyBCKCkpIDogcHJlcGFyZShuZXcgQygpKTsgICAKfQo=