Creo que tener los mismos nombres de miembros es una mala idea en este caso, porque hace que el código sea más propenso a errores.
Imagine el escenario: tiene un par de puntos cartesianos: pntA y pntB. Luego decide, por alguna razón, que deberían estar mejor representados en coordenadas polares, y cambiar la declaración y el constructor.
Ahora, si todas sus operaciones fueran solo llamadas a métodos como:
double distance = pntA.distanceFrom(pntB);
Entonces estás bien. Pero, ¿qué pasa si usaste los miembros explícitamente? Comparar
double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);
En el primer caso, el código no se compilará. Verá el error inmediatamente y podrá solucionarlo. Pero si tiene los mismos nombres de miembros, el error será solo en el nivel lógico, mucho más difícil de detectar.
Si escribe en un lenguaje no orientado a objetos, es aún más fácil pasar una estructura incorrecta a la función. ¿Qué te impide escribir el siguiente código?
double distance = calculate_distance_polar(cartesianPointA, polarPointB);
Los diferentes tipos de datos, por otro lado, le permitirán encontrar el error durante la compilación.