2011-07-22 42 views
6

En algunos libros se ha escrito que la clase que declara o hereda una función virtual se denomina clase polimórfica.Polimorfismo C++

La clase B no tiene ninguna función virtual, pero pasa más de una es una prueba.

La clase C tiene una función virtual pero no hereda.

class A {}; 
class B : public A {}; 

class C 
{ 
public: 
    virtual void f() {} 
}; 

es clase B o C polimórficos?

+0

Me suena a tarea, al menos agregue la etiqueta: p – KaiserJohaan

Respuesta

2

class C es polimórfico, lo que significa que el uso de dynamic_cast o typeid en un C& hará una comprobación de tipo de tiempo de ejecución, y llamando a las funciones miembro a través de un C& o C* utilizará despacho virtual.

(Por supuesto, la que -si regla permite que el compilador para evitar el envío de tiempo de ejecución bajo alguna condición cuando se conoce el tipo de tiempo de ejecución de antemano, como cuando se acaba de crear el objeto.)


Como @ Bill mencionado en un comentario, que no es sólo lo que dicen algunos libros, que es la definición de clase polimórfica, que se encuentra en el estándar de C++ (sección 10.3, [class.virtual]):

funciones virtuales soportan enlace dinámico y object-orien ted programación. Una clase que declara o hereda una función virtual se llama clase polimórfica.

3

Según el estándar, "Una clase que declara o hereda una función virtual se denomina clase polimórfica".

Como ni A ni B declaran ni heredan una función virtual, no son polimórficos. C declara una función virtual, por lo que es polimórfica.

8

2003: 10.3/1 estados, claramente:

Una clase que la declara o hereda una función virtual se llama una clase polimórfica.

Se llegó a decir esto por sí mismo, palabra por palabra, por lo que no entiende realmente cuál es la pregunta.

C (y sus descendientes, si agrega alguno) es polimórfico; A y B no lo son.


Tenga en cuenta que, en un sentido más amplio programación orientada a objetos, siempre se puede llevar a cabo alguna "polimorfismo" en C++ que siempre le permite conversión hacia arriba; por lo tanto, todos los objetos que heredan pueden tratarse como un tipo diferente (pero relacionado).

Sin embargo, el término "polimorfo" se define de forma ligeramente diferente en C++, donde tiene más que ver con el hecho de que pueda abatido también.Si no quiere ser confuso como el estándar de C++, puede llamar a esto "polimorfismo dinámico".

+0

Pero para una clase polimórfica el destructor debe ser virtual, aquí ninguna de las clases tiene un destructor virtual. –

+1

@Aditya: Sí, debería ser. Sin embargo, la falta de un destructor virtual no impide que la clase sea polimórfica. –

+0

@Aditya: solo si se eliminará polimórficamente. Una gran cantidad de clases nunca lo son. –