Pregunta

He leído un montón de gente que escribe "una tabla virtual que existe para que una clase que tiene una función virtual declarado en él".

Mi pregunta es, ¿ una vtable sólo existe para una clase que tiene una función virtual o también existe para las clases derivadas de la clase.

e.g

class Base{
    public:
        virtual void print(){cout<<"Base Print\n";}
};
class Derived:public Base{
    public:
        void print(){cout<<"Derived print\n";}
};

//From main.cpp 
Base* b = new Derived;
b->print();

Pregunta:No había habido vtable para la clase derivada, a continuación, el resultado no habría sido "derivados"de la impresión.Así que la OMI existe una vtable para cualquier clase que tiene la función virtual declarada, y también en clases que heredan de la clase.Es esto correcto ?

¿Fue útil?

Solución

Tan lejos como sólo virtual de la función de la funcionalidad específica de la que se considera, en un enfoque tradicional de la vtable de la implementación de la clase derivada tendría una versión independiente de la vtable si y sólo si que clase derivada se anula al menos una función virtual.En tu ejemplo, Derived reemplaza la función virtual print.Desde Derived tiene su propia versión de print, la entrada correspondiente en Derived vtable es diferente de la que en Base vtable.Esto normalmente requieren de un independiente vtable para Derived.

Si Derived no sobrescribir nada en absoluto, formalmente todavía estaría separado polimórficos de la clase, pero con el fin de hacer sus funciones virtuales funcionan correctamente podríamos simplemente se han reutilizado Base vtable para Derived así.Así que, técnicamente, no habría ninguna necesidad de otro vtable para Derived.

Sin embargo, en la práctica, la implantación de la estructura de datos que normalmente nos referimos como "vtable", a menudo se sostiene que algunos adicionales de la clase específica de información.Esta información adicional es tan específicos de la clase que la mayoría de las veces se hace imposible compartir vtables entre diferentes clases de la jerarquía, incluso si utilizan el mismo conjunto de funciones virtuales.Por ejemplo, en algunas implementaciones de la vtable puntero almacenado en cada polimórficos de los puntos del objeto a la estructura de datos que almacena también los llamados "RTTI" información acerca de la clase.Por esta razón, en la mayoría (si no todas) las implementaciones prácticas de cada polimórficos clase tiene su propia vtable, incluso si la función virtual punteros almacenados en las tablas de pasar a ser el mismo.

Otros consejos

  1. Una aplicación WINRT (supongo que es lo que quiere decir con Metro) se ejecutará en el escritorio / tableta y teóricamente un dispositivo de Windows Phone 8 sin cambios de código.Primero, tenga en cuenta que estamos hablando de Windows Phone 8 (no el teléfono de Windows 7 actual 7) y que se ejecuta, no que el diseño de UI sea exactamente correcto.

  2. Puede diseñar la aplicación, sin embargo, desee, ya sea que se ajuste al diseño de metro o algún otro aspecto.Si se desarrolla en WinRT, también debe ser compatible con el teléfono con el teléfono.

Sí, es verdad. En realidad, dada la definición de la base:

class derived:public base{
public:
 void print(){cout<<"derived print\n";}
};

es completamente equivalente a:

class derived:public base{
public:
 virtual void print(){cout<<"derived print\n";}
};

... Porque ya definiste la impresión como virtual en la base.

Desearía que el compilador hiciera cumplir eso ...

La solución temporal está usando iTunes para obtener los archivos de la carpeta de documentos.

En su .plist -> Información Lista de propiedades -> AÑADIR:

UIFileSharingEnabled (sí)

Reconstruir y ir a iTunes y obtener los archivos de la carpeta de documentos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top