7
votes

Appeler la fonction virtuelle de V-Table

Comme toute la fonction virtuelle en C ++ est stockée dans V-Table. Sur place a lieu dans le cas de la fonction virtuelle. Je tiens à poser là-bas est de quelque manière que nous pouvons appeler la fonction virtuelle directement à partir de la table et capable également déterminé quelles fonctions V-Table contiennent.


2 commentaires

Pourquoi devrait-on vouloir faire ça ?? Au moins, vous pouvez (en utilisant une adressage de la mémoire directe), aussi longtemps que vous connaissez les inernaux de votre compilateur ABI.


Pouvons-nous faire quelque chose avec V-Pointer qui est présent en classe (si la classe contient les fonctions virtuelles) qui pointe sur V-TABLE.


4 Réponses :


2
votes

Il n'y a aucune garantie par standard, que les fonctions virtuelles sont implémentées à l'aide de V-Table . Donc, seulement si vous êtes sûr, ce compilateur utilise V-Table - Vous pouvez trouver le décalage nécessaire.


4 commentaires

En C ++, il n'est pas nécessaire que le compilateur utilise la table V pour la mise en œuvre de fonctions virtuelles ???


@ user2484070 Oui, ce n'est pas nécessaire. La mise en œuvre des fonctions virtuelles dépend du compilateur.


@ user2484070, les valeurs seront stockées quelque part et d'une manière ou d'une autre, c'est certainement sûr. Cela va-t-il être une table V bien connue ou autre chose ... n'a pas d'importance.


Ouais !! Maintenant tout est clair pour moi. :-)



2
votes

Portablement, non. La langue ne spécifie pas comment une expédition virtuelle est mise en œuvre, seule la manière dont elle se comporte. Il n'est pas nécessairement mis en œuvre à l'aide d'une table en V, et il n'ya aucun moyen d'accéder à une fonction virtuelle sauf pour l'appeler.

Si vous n'avez besoin que de prendre en charge un ABI particulier, vous pouvez utiliser les détails de la mise en œuvre, ainsi que des moulages de pointeur Dodgy, pour mapper un objet à un pointeur de fonction de la même manière que le mécanisme de répartition virtuelle. Mais vous allez sortir de la langue définie en un territoire non supportable et non portable, alors je recommanderais certainement de repenser ce que vous essayez de faire.


0 commentaires

0
votes

Je dirais non en général, car la mise en oeuvre exacte de la table équipée est une plate-forme / compilateur spécifique. Si vous savez comment la plate-forme / compilateur implémente la tablette et l'adtrement, il peut être possible de le calculer en déterminant l'adresse d'une machine à installer pour une classe spécifique, puis en ajoutant un décalage d'une méthode virtuelle.

La table de distribution contient toutes les méthodes virtuelles de la classe. Vous pouvez désassembler l'application pour les voir.


0 commentaires

19
votes

Eh bien, en fait, vous pouvez. Je me fiche de la portabilité, mais dans VS, vous pouvez le faire. En supposant que nous construisons du code 32 bits avec VS, les 4 premiers octets de l'adresse des objets sont l'adresse de la fourchette. En regardant les fichiers d'en-tête, nous connaissons l'ordre des méthodes dans la tablette.

Exemple: P>

class Base
{
public:

    virtual void printMessage()
    {
        std::cout << "Base::printMessage()" << std::endl;
    }
};

class Derived : public Base
{
public:

    void printMessage()
    {
        std::cout << "Derived::printMessage()" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    Derived d;

    unsigned int vtblAddress = *(unsigned int*)&d;

    typedef void(*pFun)(void*);

    pFun printFun = (pFun)(*(unsigned int*)(vtblAddress));

    printFun(&d);

    return 0;
}


3 commentaires

C'est en fait je voulais.


Incroyable, Peter Wood, Eelke, Toro2K, Stony et Quetzalcoatl ne sont pas en mesure de dire ce qui est demandé ici. Comment se fait-il que chaque participant à ce fil comprit ce qui est posé? 5 Les gars "intelligents" avec une assez faible réputation par rapport à Mike Seymour et sont à jamais vissés tout le monde. Je veux dire, vous ne comprenez pas la question, c'est bon, mais laissez les autres personnes en discuter pour l'amour de Dieu ...


@ user1764961- Yaa Un homme vraiment incroyable !!