struct IBase {
virtual void Method() const = 0; };
template <class X> struct Sub : IBase {
X const & x;
Sub(X const & x) : x(x) {}
void Method() const { x.Method(); } };

void Func(IBase const & x) { x.Method(); }
template <class X> void Func(X const & x) { Func(Sub<X>(x)); }

このようにXが直接interfaceを継承する必要はない
XをFunc以外で利用する際にオーバーヘッドとならないようにXが直接interfaceを継承することは避けるべきである