Es una de estas cosas en las que no hay un acuerdo universal y que lleva fácilmente a confusión si miras fuentes distintas que usan convenciones distintas.
Si tienes aplicaciones \( f:A \to B \) y \( g:C \to D \), para que la función compuesta \( g \circ f:A \to C \) esté definida, hay autores que piden que \( B=C \) (diría que los más, y desde luego esta es mi opción favorita), y otros que admiten la condición más general \( f(A) \subseteq C \). En cualquier caso, obtienes una aplicación \( g \circ f:A \to D \), pues la fórmula que la define, \( (g \circ f)(x)=g(f(x)) \) para \( x \in A \), tiene sentido.
Puede parecer que la segunda definición es más general, pero en realidad es lo mismo, pues si \( f(A) \subseteq C \), puedes definir considerar la aplicación \( f':A \to C \), que es la misma función que \( f \), pero donde ahora pensamos que el conjunto de llegada es \( C \) en vez de \( B \). Entonces, \( g \circ f': A \to D \) está definida (con la definición más restrictiva) y es exactamente la misma aplicación que \( g \circ f \) definida antes, con la definición más general.
De todas formas, mi opinión personal es que es mejor pedir que \( B = C \) para que esté definida la composición, pues esto también se aplica a contextos mucho más generales donde la condición \( f(A) \subseteq C \) puede no tener sentido.