Inicio > Programación > C++ : Problemas con la herencia cuando hay sobrecarga de miembros

C++ : Problemas con la herencia cuando hay sobrecarga de miembros

Lunes, 29 de marzo de 2010 Dejar un comentario Ir a comentarios

Os muestro un sencillo tip muy brevemente. Si estás utilizando sobrecarga de funciones miembro en una clase base e intentas heredar dichos miembros en una clase derivada observarás que esta última no tiene visibilidad de todas las sobrecargas realizadas. Pongamos un ejemplo muy sencillo:

#include	<iostream>
using namespace std;

class base
{
	public:
		void A(int x) { A(x, 5); }
		virtual void A(int x, int y) = 0;
};

class derived : public base
{
	public:
		//using base::A;
		void A(int x, int y) { cout << "x+y = " << x+y << endl; }
};

int main()
{
	derived var;
	var.A(3);
}

Al intentar compilar este código nos vamos a encontrar con que el compilador nos lanza el siguiente error:

file.cpp: In function ‘int main()’:
file.cpp:21: error: no matching function for call to ‘derived::A(int)’
file.cpp:15: note: candidates are: virtual void derived::A(int, int)

Para solucionar este problema podemos hacer uso de la palabra clave using (descomentar la línea 14) que nos permite tener visibilidad de todas las sobrecargas de dicha función en nuestra clase derivada.

I present you a short tip very quickly. If you are using overload of function members in a base class and you try to inherit these members to a derived class you will observe that this last doesn’t have visibility for all the overloads performed. Here, there is a very simple example:

#include	<iostream>
using namespace std;

class base
{
	public:
		void A(int x) { A(x, 5); }
		virtual void A(int x, int y) = 0;
};

class derived : public base
{
	public:
		//using base::A;
		void A(int x, int y) { cout << "x+y = " << x+y << endl; }
};

int main()
{
	derived var;
	var.A(3);
}

When you try to compile this code, the compiler throws the following error:

file.cpp: In function ‘int main()’:
file.cpp:21: error: no matching function for call to ‘derived::A(int)’
file.cpp:15: note: candidates are: virtual void derived::A(int, int)

In order to solve this problem you can use the reserved keyword using (un-commenting the line 14) that let us to have visibility of all overloads of such function in the derived class.

GD Star Rating
loading...
C++ : Problemas con la herencia cuando hay sobrecarga de miembros, 10.0 out of 10 based on 1 rating
Share
Categories: Programación Tags: , ,
  1. Pastor
    Martes, 30 de marzo de 2010 a las 10:31 | #1
    GD Star Rating
    loading...

    Muy interesante… y me parece grandiosa la idea de publicar los post tambien en ingles…

  2. Martes, 30 de marzo de 2010 a las 10:42 | #2
    GD Star Rating
    loading...

    Gracias ! Lo del inglés es más por necesidad de aprender que por otra cosa, pero bueno espero también que de esta forma aumente el número de visitas al blog :P .

  3. Miércoles, 31 de marzo de 2010 a las 00:25 | #3
    GD Star Rating
    loading...

    mmm que interesante. En alguna ocasión tuve un problema asi y no supe que hacer =P.
    Escelente lo de publicarlo en inglés tambien; me parece que había un plugin para wordpress que te permitia mostrar el idioma de acuerdo a las preferencias del usuario… pero era para wordpress 1.x (historia antigua).
    Puedo preguntar si usas un plugin para wordpress para mejorar el aspecto visual del código?

  4. Miércoles, 31 de marzo de 2010 a las 12:42 | #4
    GD Star Rating
    loading...

    Hola Fred. Utilizo el siguiente plugin para lo del código:
    http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/

    Lo del inglés como ya dije, tengo que acostumbrarme a escribir por mi mismo, no quiero traductores ni nada por el estilo (bueno cuando me surgen dudas por supuesto que los uso jeje).

    Saludos.

  5. Jueves, 1 de abril de 2010 a las 02:10 | #5
    GD Star Rating
    loading...

    gracias por el tip. Si, tambien considero mejor la práctica de redactar tu mismo el post en inglés; sin embargo me refería a que existia un plugin que te permitía escribir tu mismo el texto para ambas versiones.
    Un saludo.

  1. Sin trackbacks aún.