Pourquoi est-ce destructeur virtuel déclencher un externe non résolu?

De considérer les éléments suivants:

Dans X. h:

class X
{
    X();
    virtual ~X();
};

X.cpp:

#include "X.h"

X::X()
{}

Essayer de construire cette (je suis en utilisant un .dll cible pour éviter une erreur sur le manque principal, et je suis en utilisant Visual Studio 2010):

Erreur 1 erreur LNK2001: symbole externe "privé virtuel: __thiscall X::~X(void)" (??1X@@EAE@XZ)

De petites modifications suite à un succès, cependant:

X. h:

class X
{
    inline X(); //Now inlined, and everything builds
    virtual ~X();
};

ou

X. h:

class X
{
    X();
    ~X(); //No longer virtual, and everything builds
};

Quelles sont les causes de l'externe non résolu dans l'éditeur de liens lors de la .dtor est virtuel ou lorsque l' .ctor n'est pas inline?

EDIT:

Ou, peut-être plus intéressant, pourquoi dois-je pas obtenir un externe non résolu, si je fais le destructeur non-virtuel, ou si je inline le constructeur?

  • Je suis sûr que je comprends la question/variantes, mais la ligne de fond est: si ça va être appelé, il a besoin d'une définition. Dans votre première variante, vous ne jamais définir le destructeur, qui est exactement ce que le message d'erreur indique. Je ne vois pas comment les variations de la construire, car il n'y a pas encore de définition d'un constructeur ou un destructeur que je peux voir.
  • Pourtant, ils le font. Donc ma confusion. Il est assez simple de code de l'échantillon, et aucun de mes collègues a une réponse définitive à ce problème. La meilleure supposition est que quelque chose d'indéfini et nous nous retrouvons dans vendeur-territoire spécifique, mais je suis curieux de savoir ce qui précisément est pas défini qui déclencherait les différences de comportements.
  • Imposable à dire, sauf si vous nous montrer tout ce qu'on vous dit!
  • York: C'est tout ce que je suis en train de construire! Littéralement! Ok, j'ai peut-être omis un retour chariot en face de l'un des fichiers, mais sérieusement, c'est tout le projet. Vous pourriez les copier dans votre propre zéro de la bibliothèque en 20 secondes. C'est cette mort simple.
  • Dans la première, il a besoin de l'adresse de l'destructeur pour construire la table virtuelle. Dans la seconde: Puisque le constructeur n'est jamais vraiment construit jamais besoin de construire la table virtuelle et n'a donc pas besoin de l'adresse du destructeur. Dans le troisième, nous n'avons pas besoin de l'adresse de l'destructeur lors de la construction du constructeur (comme il n'est plus dans la table virtuelle);.
InformationsquelleAutor Greg D | 2010-08-24