¿Cuál es la diferencia entre una función abstracta y una función virtual?


¿Cuál es la diferencia entre una función abstracta y una función virtual? ¿En qué casos se recomienda utilizar virtual o abstracto? Que es el enfoque más correcto?

Author: iBug, 2008-12-24

23 answers

Una función abstracta no puede tener funcionalidad. Básicamente estás diciendo que cualquier clase hija DEBE dar su propia versión de este método, sin embargo, es demasiado general para intentar implementarlo en la clase padre.

Una función virtual, básicamente está diciendo mira, aquí está la funcionalidad que puede o no ser lo suficientemente buena para la clase hija. Así que si es lo suficientemente bueno, use este método, si no, entonces anúleme y proporcione su propia funcionalidad.

 2368
Author: BFree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-15 15:47:03

Una función abstracta no tiene implementación y solo puede ser declarada en una clase abstracta. Esto obliga a la clase derivada a proporcionar una implementación. Una función virtual proporciona una implementación predeterminada y puede existir en una clase abstracta o en una clase no abstracta. Por ejemplo:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}
 254
Author: JoshBerke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-12 08:14:39
  1. Solo abstract las clases pueden tener abstract miembros.
  2. Una clase no - abstract que hereda de una clase abstract debe override sus abstract miembros.
  3. Un miembro abstract es implícitamente virtual.
  4. Un miembro abstract no puede proporcionar ninguna implementación (abstract se llama pure virtual en algunos idiomas).
 71
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-16 09:03:40

Siempre debe sobrescribir una función abstracta.

Así:

  • Funciones abstractas - cuando el heredero debe proporcionar su propia implementación
  • Virtual - cuando depende del heredero decidir
 51
Author: Rinat Abdullin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-10 16:37:41

Función abstracta:

  1. Solo se puede declarar dentro de la clase abstracta.
  2. Contiene solamente declaración de método no la implementación en clase abstracta.
  3. Debe ser anulado en clase derivada.

Función virtual:

  1. Se puede declarar tanto dentro de la clase abstracta como dentro de la clase no abstracta.
  2. Contiene la implementación del método.
  3. Puede ser anulado.
 30
Author: Lexnim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-13 08:58:54

Método Abstracto: Cuando una clase contiene un método abstracto, esa clase debe declararse como abstracta. El método abstracto no tiene implementación y, por lo tanto, las clases que derivan de esa clase abstracta, deben proporcionar una implementación para este método abstracto.

Método virtual: Una clase puede tener un método virtual. El método virtual tiene una implementación. Cuando hereda de una clase que tiene un método virtual, puede anular el método virtual y proporcionar información adicional lógica, o reemplazar la lógica con su propia implementación.

Cuándo usar qué: En algunos casos, sabes que ciertos tipos deben tener un método específico, pero no sabes qué implementación debe tener este método.
En tales casos, puede crear una interfaz que contenga un método con esta firma. Sin embargo, si tiene tal caso, pero sabe que los implementadores de esa interfaz también tendrán otro método común (para el cual ya puede proporcionar la implementación), puede crear una clase abstracta. Esta clase abstracta entonces contiene el método abstracto (que debe ser anulado), y otro método que contiene la lógica 'común'.

Se debe usar un método virtual si tiene una clase que se puede usar directamente, pero para la cual desea que los herederos puedan cambiar cierto comportamiento, aunque no es obligatorio.

 27
Author: Frederik Gheysels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-16 09:03:07

Explicación: con analogías. espero que te ayude.

Context

Trabajo en el piso 21 de un edificio. Y estoy paranoico con el fuego. De vez en cuando, en algún lugar del mundo, un fuego está quemando un rascador de cielo. Pero afortunadamente tenemos un manual de instrucciones en algún lugar aquí sobre qué hacer en caso de incendio:

FireEscape()

  1. No recoja pertenencias
  2. Camina hacia la escalera de incendios
  3. Salir de edificio

Este es básicamente un método virtual llamado FireEscape()

Método virtual

Este plan es bastante bueno para el 99% de las circunstancias. Es un plan básico que funciona. Pero hay un 1% de probabilidad de que la escalera de incendios esté bloqueada o dañada, en cuyo caso estás completamente jodido y te convertirás en pan tostado a menos que tomes alguna acción drástica. Con los métodos virtuales puedes hacer precisamente eso: puedes anular el plan básico FireEscape () con tu propio plan versión del plan:

  1. Ejecutar a la ventana
  2. Saltar por la ventana
  3. Paracaídas seguro hasta el fondo

En otras palabras los métodos virtuales proporcionan un plan básico, que puede ser anulado si lo necesita. Las subclases pueden anular el método virtual de la clase padre si el programador lo considera apropiado.

Métodos abstractos

No todas las organizaciones están bien entrenadas. Algunas organizaciones no hacen simulacros de incendio. No tienen un política general de escape. Cada hombre es para sí mismo. La gerencia solo está interesada en que exista una política de este tipo.

En otras palabras, cada persona es forzada a desarrollar su propio método FireEscape (). Un tipo saldrá por la escalera de incendios. Otro tipo se lanzará en paracaídas. Otro tipo usará la tecnología de propulsión de cohetes para volar lejos del edificio. Otro tipo hará rappel. A la administración no le importa cómo escapar, siempre y cuando tengas un plan básico de FireEscape () - si no lo tienen se le puede garantizar que OHS caerá sobre la organización como una tonelada de ladrillos. Esto es lo que se entiende por un método abstracto.

¿Cuál es la diferencia entre los dos?

Método abstracto: las subclases son forzado para implementar su propio método FireEscape. Con un método virtual, tienes un plan básico esperándote, pero puedes elegir para implementar tu propio si no es lo suficientemente bueno.

Eso no fue tan difícil, ¿verdad?

 23
Author: BKSpurgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-02 07:53:07

Un método abstracto es un método que debe implementarse para hacer una clase concreta. La declaración está en la clase abstracta (y cualquier clase con un método abstracto debe ser una clase abstracta) y debe implementarse en una clase concreta.

Un método virtual es un método que puede ser sobrescrito en una clase derivada usando el override, reemplazando el comportamiento en la superclase. Si no anulas, obtienes el comportamiento original. Si lo haces, siempre obtienes el nuevo comportamiento. Esto se opone a los métodos no virtuales, que no pueden ser anulados, pero puede ocultar el método original. Esto se hace usando el modificador new.

Ver el siguiente ejemplo:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

Cuando instancio DerivedClass y llamo SayHello, o SayGoodbye, obtengo "Hola" y "Nos vemos más tarde". Si llamo HelloGoodbye, recibo "Hola" y "Hasta luego". Esto se debe a que SayGoodbye es virtual, y puede ser reemplazado por clases derivadas. SayHello solo está oculto, por lo que cuando lo llamo desde mi clase base obtengo mi original método.

Los métodos abstractos son implícitamente virtuales. Definen el comportamiento que debe estar presente, más como lo hace una interfaz.

 21
Author: Kamiel Wanrooij,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 03:01:06

Los métodos abstractos son siempre virtuales. No pueden tener una implementación.

Esa es la principal diferencia.

Básicamente, usaría un método virtual si tiene la implementación 'predeterminada' del mismo y desea permitir que los descendientes cambien su comportamiento.

Con un método abstracto, se obliga a los descendientes a proporcionar una implementación.

 9
Author: Rashack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-10 16:39:38

Hice esto más simple haciendo algunas mejoras en las siguientes clases (de otras respuestas):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestOO
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass _base = new BaseClass();
            Console.WriteLine("Calling virtual method directly");
            _base.SayHello();
            Console.WriteLine("Calling single method directly");
            _base.SayGoodbye();

            DerivedClass _derived = new DerivedClass();
            Console.WriteLine("Calling new method from derived class");
            _derived.SayHello();
            Console.WriteLine("Calling overrided method from derived class");
            _derived.SayGoodbye();

            DerivedClass2 _derived2 = new DerivedClass2();
            Console.WriteLine("Calling new method from derived2 class");
            _derived2.SayHello();
            Console.WriteLine("Calling overrided method from derived2 class");
            _derived2.SayGoodbye();
            Console.ReadLine();
        }
    }


    public class BaseClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }
        public virtual void SayGoodbye()
        {
            Console.WriteLine("Goodbye\n");
        }

        public void HelloGoodbye()
        {
            this.SayHello();
            this.SayGoodbye();
        }
    }


    public abstract class AbstractClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }


        //public virtual void SayGoodbye()
        //{
        //    Console.WriteLine("Goodbye\n");
        //}
        public abstract void SayGoodbye();
    }


    public class DerivedClass : BaseClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }

        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }

    public class DerivedClass2 : AbstractClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }
        // We should use the override keyword with abstract types
        //public new void SayGoodbye()
        //{
        //    Console.WriteLine("See you later2");
        //}
        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }
}
 9
Author: MeqDotNet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-10 16:46:59

Binding es el proceso de asignar un nombre a una unidad de código.

Late binding significa que usamos el nombre, pero diferimos la asignación. En otras palabras, creamos / mencionamos el nombre primero, y dejamos que algún proceso posterior maneje la asignación de código a ese nombre.

Ahora considere:

  • En comparación con los humanos, las máquinas son realmente buenas en la búsqueda y clasificación{[16]]}
  • En comparación con las máquinas, los seres humanos son realmente buenos en la invención y innovación

Entonces, la respuesta corta es: {[0] } es una instrucción de enlace tardío para la máquina (tiempo de ejecución) mientras que abstract es la instrucción de enlace tardío para el humano (programador)

En otras palabras, virtual significa:

"Querido runtime , enlaza el código apropiado a este nombre haciendo lo que mejor sabes hacer: buscando "

Considerando que abstract significa:

" Estimado programador , por favor vincule el código apropiado a este nombre haciendo lo que mejor sabe hacer: inventando"

En aras de la integridad, sobrecargar significa:

"Querido compilador, enlaza el código apropiado a este nombre haciendo lo que mejor sabes hacer: ordenando".

 4
Author: Rodrick Chapman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 19:29:34

Básicamente se utiliza un método virtual cuando se desea que los herederos amplíen la funcionalidad SI así lo desean.

Utiliza métodos abstractos cuando desea que los herederos implementen la funcionalidad (y en este caso no tienen opción)

 3
Author: Brann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-16 09:02:26

He visto en algunos lugares el método abstracto se define como abajo. **

"Un método Abstracto debe tener que implementarse en la clase hija"

** Sentí que es así .

No es necesario que un método abstracto tenga que ser implementado en una clase hija, si la clase hija también es abstracta ..

1)Un método abstracto cant ser un método privado. 2) An Abstract method can be implemented in the same clase abstracta.

Yo diría ..si estamos implementando una clase abstracta, debe tener que anular los métodos abstractos de la clase abstracta base. Porque.. Implementar el método abstracto es con override palabra clave .Similar al método Virtual.

No es necesario que un método virtual se implemente en una clase heredada.

                                 ----------CODE--------------

public abstract class BaseClass
{
    public int MyProperty { get; set; }
    protected abstract void MyAbstractMethod();

    public virtual void MyVirtualMethod()
    {
        var x = 3 + 4;
    }

}
public abstract class myClassA : BaseClass
{
    public int MyProperty { get; set; }
    //not necessary to implement an abstract method if the child class is also abstract.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
public class myClassB : BaseClass
{
    public int MyProperty { get; set; }
    //You must have to implement the abstract method since this class is not an abstract class.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
 3
Author: Kodoth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-23 22:18:56

Método virtual :

  • Virtual significa que PODEMOS anularlo.

  • La función virtual tiene una implementación. Cuando heredamos la clase que puede anular la función virtual y proporcionar nuestra propia lógica.

  • Podemos cambiar el tipo de retorno de la función virtual mientras implementamos el
    función en la clase hija (que se puede decir como un concepto de
    Shadowing).

Resumen Método

  • Abstracto significa que DEBEMOS anularlo.

  • Una función abstracta no tiene implementación y debe estar en una clase abstracta.

  • Sólo se puede declarar. Esto obliga a la clase derivada a proporcionar la implementación de la misma.

  • Un miembro abstracto es implícitamente virtual. El resumen puede ser llamado como virtual puro en algunos de los idiomas.

    public abstract class BaseClass
    { 
        protected abstract void xAbstractMethod();
    
        public virtual void xVirtualMethod()
        {
            var x = 3 + 4;
        }
    } 
    
 3
Author: flik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 20:31:09

Abstract function no puede tener un cuerpo y debe ser anulado por las clases secundarias

La función virtual tendrá un cuerpo y puede o no ser anulada por clases secundarias

 2
Author: Yeasin Abedin Siam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 17:17:10

La mayoría de los ejemplos anteriores usan código - y son muy, muy buenos. No necesito agregar a lo que dicen, pero la siguiente es una explicación simple que hace uso de analogías en lugar de términos de código/técnicos.

Explicación simple-Explicación usando analogías

Método Abstracto

Piensa en George W. Bush. Dice a sus soldados: "Vayan a luchar en Irak". Y eso es todo. Todo lo que ha especificado es que hay que luchar. No especifica cómo exactamente eso sucederá. Pero quiero decir, no puedes simplemente salir y "pelear": ¿qué significa eso exactamente? ¿peleo con un B-52 o con mi derringer? Esos detalles específicos se dejan a otra persona. Este es un método abstracto.

Método virtual

David Petraeus es alto en el ejército. Él ha definido lo que significa lucha:

  1. Encuentra al enemigo
  2. Neutralízalo.
  3. Tomar una cerveza después

El problema es que es muy general método. Es un buen método que funciona, pero a veces no es lo suficientemente específico. Lo bueno para Petraeus es que sus órdenes tienen libertad y alcance - ha permitido a otros cambiar su definición de" lucha", de acuerdo con sus requisitos particulares.

Private Job Bloggs lee la orden de Petraeus y se le da permiso para implementar su propia versión de fight, de acuerdo con sus requisitos particulares:

  1. Encuentra al enemigo.
  2. Dispárale en la cabeza.
  3. Go Inicio
  4. Toma cerveza.

Nouri al Maliki también recibe las mismas órdenes de Petraeus. Él también debe luchar. Pero es un político, no un hombre de infantería. Obviamente no puede ir por ahí disparando a sus enemigos políticos en la cabeza. Debido a que Petraeus le ha dado un método virtual, entonces Maliki puede implementar su propia versión del método de lucha, de acuerdo con sus circunstancias particulares:

  1. Encuentra al enemigo.
  2. Que lo arresten con algunas mentiras inventadas cargo.
  3. Vete a casa
  4. Toma cerveza.

EN otras palabras, un método virtual proporciona instrucciones repetitivas, pero estas son instrucciones generales, que pueden ser más específicas por personas de la jerarquía del ejército, de acuerdo con sus circunstancias particulares.

La diferencia entre los dos

  • George Bush no prueba ningún detalle de implementación. Esto debe ser proporcionado por otra persona. Este es un resumen método.

  • Petraeus por otro lado proporciona detalles de implementación, pero ha dado permiso a sus subordinados para anular sus órdenes con su propia versión, si pueden llegar a algo mejor.

Espero que eso ayude.

 2
Author: BKSpurgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-06 00:55:57

Función abstracta (método):

● Un método abstracto es un método que se declara con la palabra clave abstract.

● no tiene cuerpo.

● debe ser implementado por la clase derivada.

● Si un método es abstracto entonces la clase debe abstraerse.

Función virtual (método) :

● Un método virtual es el método que se declara con la palabra clave virtual y que puede ser anulado por el método de clase derivada mediante el uso de override palabra clave.

● Depende de la clase derivada si sobrescribirla o no.

 2
Author: Kedarnath M S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-26 08:11:03

La respuesta se ha proporcionado varias veces, pero la pregunta sobre cuándo usar cada una es una decisión de tiempo de diseño. Me gustaría ver como una buena práctica tratar de agrupar definiciones de métodos comunes en interfaces distintas y tirarlas en clases en niveles de abstracción apropiados. Volcando un conjunto común de definiciones de métodos abstractos y virtuales en una clase hace que la clase sea inalterable cuando puede ser mejor definir una clase no abstracta que implemente un conjunto de interfaces concisas. Como siempre, depende de lo que mejor se adapte a sus necesidades específicas de aplicaciones.

 1
Author: ComeIn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-19 10:28:31

Desde la vista general orientada a objetos:

Con respecto al método abstracto: Cuando pones un método abstracto en la clase padre realmente estás diciendo a las clases hijas: Hey nota que tienes una firma de método como esta. Y si quieres usarlo, debes implementar el tuyo propio.

Con respecto a la función virtual : Cuando pones un método virtual en la clase padre estás diciendo a las clases derivadas : Hey hay una funcionalidad aquí que hace algo por ti. Si esto es útil para usted solo tiene que usarlo. Si no, anule esto e implemente su código, ¡incluso usted puede usar mi implementación en su código !

esta es una filosofía acerca de diferentes entre estos dos conceptos en General OO

 1
Author: Mohammad Nikravesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 10:35:20

No hay nada llamado clase virtual en C#.

Para funciones

  1. La función abstracta solo tiene firma,la clase de unidad debe sobrescribirse con funcionalidad.
  2. La función virtual mantendrá la parte de funcionalidad que la clase de unidad puede o no sobrescribirla de acuerdo con el requisito

Usted puede decidir con su requisito.

 1
Author: Nithila Shanmugananthan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-28 14:29:30

El método abstracto no tiene un implementation.It se declara en la clase padre. La clase hija es responsable de implementar ese método.

El método virtual debe tener una implementación en la clase padre y facilita que la clase hija elija si usar esa implementación de la clase padre o tener una nueva implementación por sí misma para ese método en la clase hija.

 0
Author: Vinay Chanumolu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 12:38:45

Una función abstracta es "solo" una firma, sin una implementación. Se utiliza en una interfaz para declarar cómo se puede usar la clase. Debe implementarse en una de las clases derivadas.

La función virtual (método en realidad), es una función que usted declara también, y debe implementarse en una de las clases de jerarquía de herencia.

Las instancias heredadas de dicha clase, heredan la implementación también, a menos que la implemente, en una clase de jerarquía inferior.

 0
Author: Sagi Berco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 11:07:41

, A mi entender:

Métodos abstractos:

Solo la clase abstract puede contener métodos abstractos. También la clase derivada necesita implementar el método y no se proporciona ninguna implementación en la clase.

Métodos virtuales:

Una clase puede declarar estos y también proporcionar la implementación de los mismos. También la clase derivada necesita implementar el método para sobrescribirlo.

 -2
Author: Qaiser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 16:59:14