Virtual Functions


Virtual Functions

The figure below shows a typical class diagram. The base class must be as generic as possible so that it can be reused. As one class is derived from another one, the derived class is a specialization of the based class and it is more specific. A virtual function is a member function in the base class that has a generic implementation, but in the derived class the function needs to behave differently. In other words, it is possible to provide two implementations (or more) for a virtual function: one implementation in the base class and another implementation in the derived class.
La figura de abajo muestra un diagrama de clases típico. La clase base debe ser tan genérica como sea posible de tal forma que esta pueda ser reusada. Como una clase es derivada de otra, la clase derivada es una especialización de la clase base y es más específica. Una función virtual es una función miembro en la clase base que tiene una implementación genérica, pero en la clase derivada la función tiene que comportarse en forma diferente. En otras palabras, es posible proporcionar dos implementaciones (o más) para una función virtual: una implementación en la clase base y otra implementación en la clase derivada.

VirtualFunction

Tip
General Idea: I will move somewhere in the world
More Specific: I will move to Europe
More Specific: I will move to Germany
More Specific: I will move to Berlin
More Specific: I will move to Berlin and work at TU Berlin University
Idea General: Me voy a vivir a otro país
Más específico: Me voy a vivir a Europa
Más específico: Me voy a vivir a Alemania
Más específico: Me voy a vivir a Berlin
Más específico: Me voy a vivir a Berlin y a trabajar en la universidad de TU Berlin

Problem 1
Some functions in the MyPoint class are not working properly in the My3DPoint class. In this problem, you will fix the GetMin(), GetMax() and GetAverage() functions only. First, declare these functions as virtual in the MyPoint.h file. Second, implement these functions in the My3DPoint class as shown.
Algunas funciones en la clase MyPoint no están funcionando apropiadamente en la clase My3DPoint. En este problema, usted arreglará solamente las funciones: GetMin(), GetMax() y GetAverage(). Primero, declare estas funciones como virtuales en el archivo MyPoint.h. Segundo, implemente estas funciones in la case My3DPoint como se muestra.

MyPoint.h
#pragma once
class MyPoint
{
public:
     MyPoint(void);
     MyPoint(const MyPoint& init);
     ~MyPoint(void);
     double x;
     double y;
     double GetModule();
     double GetAbsModule();
     virtual double GetMax(); // VIRTUAL
     virtual double GetMin(); // VIRTUAL
     virtual double GetAverage(); // VIRTUAL
     double GetStd();
     MyPoint& operator=(const MyPoint& init);
     MyPoint operator+(const MyPoint& point);
     MyPoint operator-(const MyPoint& point);
     MyPoint operator--();
     MyPoint operator--(int not_used);
     MyPoint operator++();
     MyPoint operator++(int not_used);
     bool operator==(const MyPoint& point);
     bool operator!=(const MyPoint& point);
     bool operator<(const MyPoint& point);
     bool operator>(const MyPoint& point);
private:
     void Copy(const MyPoint& init);
};

My3DPoint.h
#pragma once
#include "mypoint.h"
class My3DPoint : public MyPoint
{
public:
     My3DPoint(void);
     ~My3DPoint(void);
     double z;
     double GetMax();
     double GetMin();
     double GetAverage();
};

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     My3DPoint a;
     a.x = 10.0;
     a.y = 12.0;
     a.z = -10.0;
     wstring text;
     Sys::Format(text, L"Minimum = %g\r\n", a.GetMin());
     tbxOutput.Text += text;
     //
     Sys::Format(text, L"Maximum = %g\r\n", a.GetMax());
     tbxOutput.Text += text;
     //
     Sys::Format(text, L"Average = %g\r\n", a.GetAverage());
     tbxOutput.Text += text;

     MyPoint b;
     b.x = 11.5;
     b.y = -5.5;
     Sys::Format(text, L"Minimum = %g\r\n", b.GetMin());
     tbxOutput.Text += text;
}


My3DPointVirtual

Tip
Inheritance allows creating a class from a previously created class. The base class is not modified for the creation of the new class. The derived class has the same properties and functions of the base class plus some specific properties and functions. Additionally, the derived class may replace some of the functions of the base class. In the previous example, the variable z is added in the MyPoint3D class, and the GetMin function is modified so that it can take into account the value of z. This way, it is possible to write compact code instead of duplicating code in both classes.
La herencia permite crear una clase de una clase previamente creada. La clase base no se altera por la creación de la nueva clase. La clase derivada tiene las mismas propiedades y funciones de la clase base mas algunas propiedades y funciones específicas. Adicionalmente, la clase derivada puede reemplazar algunas de las funciones de la clase base. En el ejemplo previo la variable z se agrega a la clase MyPoint3D y la función GetMin se modifica para que pueda tomar el cuenta el valor de z. De esta forma, es posible escribir código compacto en lugar de duplicar el código en ambas clases.

Tip
Advantages of inheritance and virtual functions:
  • The user can use the same function name to manipulate objects that are derived from the same class
  • Allows extending a class modifying some of the functions in the derived class

Ventajas de la herencia y las funciones virtuales:
  • El usuario usa el mismo nombre de la función para manipular objetos derivados de una misma clase
  • Permite extender una clase modificando las funciones en la clase derivada

Problem 2
Create a complete project that illustrates how to use virtual functions, you must design at least two classes.
Cree un proyecto completo que ilustre como usar las funciones virtuales, usted debe diseñar al menos dos clases.

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home