2011-10-04 18 views
8

Lo que creo es que el tipo dinámico significa objeto dinámicamente asignado utilizando new. En el siguiente caso, ¿dice que p apunta al tipo dinámico o al tipo de objeto estático? En estándar, no dice que el tipo dinámico sea un objeto dinámico.¿Qué es el tipo dinámico de objeto?

1.3.3 - El tipo del objeto más derivada (1,8) a la que el lvalue denota por una expresión lvalue refiere. [Ejemplo: si un puntero (8.3.1) p cuyo tipo estático es "apuntador a la clase B" apunta a un objeto de la clase D, derivado de B (cláusula 10), el tipo dinámico de la expresión * p es "D." Las referencias (8.3.2) son tratadas de manera similar. ]

También lo que lo hace la siguiente cita significa

El tipo dinámico de una expresión rvalue es su tipo estático

class Base { 
    virtual void foo(){} 
}; 

class Derived : public Base { 
    void foo(){} 
}; 

int main() 
{ 
    Derived d; 
    Base *p = &d; 
} 

Respuesta

19

Lo que pienso es que el tipo dinámico significa el objeto asignado dinámicamente usando nuevo.

Nope.

El tipo dinámico es el tipo real de un objeto al que se puede acceder a través de una referencia (puntero incluido) que apunta a un tipo de base de su tipo real.

Es decir, si tenemos:

class A { 

}; 

class B : public A { }; 


B l; 
A& k = l; 

Aquí k es una referencia a un objeto de tipo A, pero el tipo real del objeto a que se refiere, su tipo dinámico, es B.

Aquí "dinámico" tiene el significado de "conocido solo en tiempo de ejecución".

+0

+1 Claro, conciso, buen ejemplo. – Lou

+3

+1, pero creo que podría hacer que el ejemplo sea aún más claro al agregar un ejemplo que no utiliza nada nuevo. –

+0

¿No bastaría 'A & k = B();'? – arne

5

El estática tipo es el tipo de la variable, que es el único tipo conocido en tiempo de compilación (por lo tanto se considera estático, no se puede cambiar). El tipo dinámico es el tipo de objeto que en realidad apunta al en tiempo de ejecución. Dinámico aquí significa que solo se conoce en tiempo de ejecución, lo que significa que podría cambiar (es decir, una variable puede apuntar a varios objetos de varios tipos).

El uso de new en este contenido no es relevante, como muestra su propio ejemplo. En general, el tipo estático y dinámico de d es Derived, porque no es un puntero o referencia. p, sin embargo, tiene un tipo estático de Base, pero en su código, el tipo dinámico sería Derived.

3

En un lenguaje de tipos estáticos, tales como C++ o Java por ejemplo, static puede referirse a la información conocida en tiempo de compilación mientras dynamic se refiere a la información conocida en tiempo de ejecución.

Por ejemplo:

struct Base { virtual std::string name() const { return "Base"; } }; 

struct Derived: Base { std::string name() const { return "Derived"; } }; 

void print(Base const& b) { std::cout << b.name() << "\n"; } 

En el método print, el tipo de bstatic es Base const&. Por lo tanto, el compilador verificará que todos los métodos llamados existan en el contexto de un objeto Base.

Sin embargo, cuando viene ejecución, la llamada a name, ya que el método es virtual, se realiza con respecto al tipo del objeto dynamic:

  • esto puede ser Base
  • esto puede ser Derived
  • esto puede ser otra clase derivada de Base que no sabemos todavía

Por lo tanto, en el siguiente ejemplo:

int main(int argc, char* argv[]) { 
    if (argc == 1) { 
    Base base; 
    print(); 
    } else { 
    Derived derived; 
    print(derived); 
    } 
}; 
  • El static y dynamic tipo de base es Base y derived es Derived.
  • En el método print, el tipo de bstatic es Base (siempre)
  • Dependiendo del número de argumentos, el dynamic de b es o bien Base o Derived

Es un error actual para asumir ese polimorfismo se basa necesariamente en la asignación dinámica de la memoria, pero los dos conceptos, aunque no ortogonales, se pueden usar uno sin el otro en algunas condiciones.

-1

La asignación de memoria dinámica siempre se realiza en tiempo de ejecución. Esto se puede lograr utilizando la palabra clave "nueva". pero hay un caso más como se menciona en su problema * p = & d aquí como ha hecho que la clase base funcione "Virtual" le dice al compilador que trate "p" por Contenido y no por el tipo de puntero al que pertenece Así que esta es una de las asignaciones de memoria dinámica ya que el compilador nunca sabe qué dirección de objeto de clase va a almacenar en tiempo de ejecución, solo sabe qué tipo de puntero es (es decir, puntero de clase base o puntero de clase derivado).

Cuestiones relacionadas