#include #include template struct A {}; template struct B1 : virtual A {}; template struct B2 : virtual A {}; struct B3 : B1, B2 { void f() const {std::cout<<"B3::f"< { void f() const {std::cout<<"C2::f"<, B2 { void f() const {std::cout<<"C3::f"< struct X { static void f(...) {std::cout<<"T("< base"<*) {std::cout<<"T("< base"<f();} template static void f(T*t,A*) {std::cout<<"T("< base with T!=U("<f();} }; template void f(T*t) { X::f(t,t); } int main() { f((C0*)0); f((C1*)0); f((C2*)0); f((C3*)0); }