Cómo llamar a la función overriden de clase padre en C ++?

votos
-1

El resultado esperado:

Child = 2
Parent = 1

Mi código:

class Parent{
    int a;
    public:
        void display(){
            a = 1;
            cout << Parent =  << a << endl;
        }
};

class Child:public Parent{
    int b;
    public:
        void display(){
            b = 2;
            cout << Child =  << b << endl;
        }
};

int main()
{
    Parent *p = new Child();
    Child c;

    //write your code here
    /* My solution :
      c.display();
      Parent* a = &c;
      a->display();
    */


}

Hice uso de estática unión a llamar correctamente a la función de miembro de pantalla () de la clase padre

Sin embargo, me pregunto si hay alguna solución mejor para esta pregunta.

¿Cuál es el propósito de tener esta línea Parent *p = new Child();? ¿Es un puntero que apunta a un constructor?

¿Cuál es la diferencia entre esa línea y Parent *p = new Child;?

Publicado el 09/10/2019 a las 18:49
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Hay varios puntos de hacer aquí:

  1. ChildNo está anulando cualquier cosa, sólo se esconde el método de la clase base. Primordial requeriría virtualfunciones miembro, y se puede comprobar que un método en realidad se impone a una función de clase de base mediante la adición de la overridepalabra clave. Ni la clase es polimórfico, ya que no existen métodos virtuales en cualquier lugar.

  2. Debido a que sus clases no son polimórficos, tendrá sólo tenga enlace estático, sin unión dinámica. (Usted identificó correctamente que esto ocurra).

  3. Para llamar a una función de clase base que se anula o se oculta en una clase derivada, el prefijo de la llamada con el nombre de la clase base y ::, de este modo:

    class Child : public Parent{
      int b;
      public:
        void display(){
          Parent::display();
        }
    };
    
    // or
    
    int main()
    {
      Child c;
      c.Parent::display();
    }
    
  4. No hay ninguna diferencia entre Parent *p = new Child();y Parent *p = new Child;en su código, tanto llama al constructor por defecto para inicializar un nuevo objeto secundario. Para los tipos al igual que inthay una diferencia, new int;crea un sin inicializar intobjeto, new int();(o new int{};) inicializa a cero en su lugar.

Respondida el 09/10/2019 a las 18:59
fuente por usuario

votos
1

Cómo llamar a la función overriden de clase padre en C ++?

En realidad no se ha anulado ninguna función en su ejemplo. Sólo funciones miembro virtuales se pueden anular, y displayes no virtual.

Hice uso de estática unión a llamar correctamente a la función de miembro de pantalla () de la clase padre

Su solución funciona porque no hay una imperiosa o funciones virtuales en cuestión. Otra forma de llamar a la función miembro oculta es utilizar el operador de resolución de alcance:

c.Parent::display();

Este usaría unión estática incluso si la función era virtual.


¿Cuál es el propósito de tener esta línea Parent *p = new Child();?

No parece tener ningún propósito en su programa. En general, newse utiliza para asignar dinámicamente objetos de la tienda libre.

¿Es un puntero que apunta a un constructor?

No. papunta al objeto dinámico que se creó en la tienda libre.

¿Cuál es la diferencia entre esa línea y Parent *p = new Child;?

Sin paréntesis, utiliza la sintaxis de inicialización por defecto. con paréntesis se utiliza el valor de inicialización.

Respondida el 09/10/2019 a las 19:02
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more