Para C++, la sobrecarga del operador se realiza a nivel del compilador mediante un proceso de creación de nombres que crea un identificador de nombre único para cada función para que el enlazador no se queje de las definiciones de funciones duplicadas. En C++, la sobrecarga del operador es posible porque las operaciones cargables como +
, -
, *
, etc. son funciones reales que tienen el prefijo operator
seguido del símbolo de la operación. Así, por ejemplo, una sobrecarga operator+
función con una firma de función como
my_type operator+(const my_type& lhs, const my_type& rhs);
no entre en conflicto con otro operator+
función con una firma diferente, a pesar de que ambas funciones tienen el mismo nombre operator+
, ya que cada versión de la función tendrá un nombre diferente en el nivel de lenguaje ensamblador una vez que se completa el proceso de creación de nombres del compilador C++. El mapeo de nombres tiene otro beneficio, ya que permite que el código compilado en C y C++ se use con el mismo enlazador, ya que dos funciones con el mismo nombre no existirán y causarán un error del enlazador.
Tenga en cuenta que en C, incluso si crea dos funciones con firmas diferentes, si tienen el mismo nombre, dado que el compilador C no hará ningún cambio de nombre, el enlazador se quejará de las definiciones duplicadas de la función .
Depende de lo que signifique "anular". AIUI, una función no virtual puede anularse, pero la función llamada se determina en tiempo de compilación. Probablemente también pueda hacer cosas divertidas como 'virtual void operator()();' ... –
@ tc- Una función no virtual en C++ puede estar ** sobrecargada ** pero no ** anulada **. Intentar anular una función no virtual solo introduce una sobrecarga en la clase derivada. – templatetypedef
@tc .: No. Las funciones no virtuales están ocultas, no anuladas. –