web-dev-qa-db-fra.com

Une table manquante signifie généralement que la première fonction de membre virtuel non en ligne n'a pas de définition

Je suis presque sûr que cette question est en double, mais mon code est différent ici, ce qui suit est mon code. Il échoue avec une erreur "Symboles non définis", pas sûr de ce qui manque.

class Parent {
   public :
     virtual int func () = 0;
     virtual ~Parent();

 };


 class Child : public Parent {
     public :

     int data;
     Child (int k) {
        data = k;
      }
    int func() {   // virtual function
       cout<<"Returning square of 10\n";
        return 10*10;
    }

    void Display () {
    cout<<data<<"\n";

 }

 ~ Child() {

    cout<<"Overridden Parents Destructor \n";

 }
};



int main() {
  Child a(10);
 a.Display();

 }

Ce qui suit est l'O/P une fois compilé.

Undefined symbols for architecture x86_64:
  "Parent::~Parent()", referenced from:
      Child::~Child() in inher-4b1311.o
  "typeinfo for Parent", referenced from:
      typeinfo for Child in inher-4b1311.o
  "vtable for Parent", referenced from:
      Parent::Parent() in inher-4b1311.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
12
Aparna Chaganti

Parent::~Parent() n'est pas définie.

Vous pouvez mettre la définition directement dans la définition de classe:

class Parent {
   public :
     virtual int func () = 0;
     virtual ~Parent() {};
 };

Ou définissez-le séparément. Ou, depuis C++ 11, écrivez virtual ~Parent() = default;.

Dans tous les cas, un destructeur a besoin d'une définition.

14
Christian Hackl