C++ Undefined Reference to vtable and inheritance

86,778

Solution 1

Why the error & how to resolve it?

You need to provide definitions for all virtual functions in class A. Only pure virtual functions are allowed to have no definitions.

i.e: In class A both the methods:

virtual ~A();
virtual void doWork();

should be defined(should have a body)

e.g.:

A.cpp

void A::doWork()
{
}
A::~A()
{
}

Caveat:
If you want your class A to act as an interface(a.k.a Abstract class in C++) then you should make the method pure virtual.

virtual void doWork() = 0;

Good Read:

What does it mean that the "virtual table" is an unresolved external?
When building C++, the linker says my constructors, destructors or virtual tables are undefined.

Solution 2

My objective is for A to be an Interface, and to seperate implementation code from headers.

In that case, make the member function as pure virtual in class A.

class A {
  // ...
  virtual void doWork() = 0;
};

Solution 3

Make sure to delete any "*.gch" files if none of the other responses help you.

Share:
86,778
rjmarques
Author by

rjmarques

Updated on November 10, 2020

Comments

  • rjmarques
    rjmarques over 3 years

    File A.h

    #ifndef A_H_
    #define A_H_
    
    class A {
    public:
        virtual ~A();
        virtual void doWork();
    };
    
    #endif
    

    File Child.h

    #ifndef CHILD_H_
    #define CHILD_H_
    
    #include "A.h"
    
    class Child: public A {
    private:
        int x,y;
    public:
        Child();
        ~Child();
        void doWork();
    };
    #endif
    

    And Child.cpp

    #include "Child.h"
    
    Child::Child(){
        x = 5;
    }
    
    Child::~Child(){...}
    
    void Child::doWork(){...};
    

    The compiler says that there is a undefined reference to vtable for A. I have tried lots of different things and yet none have worked.

    My objective is for class A to be an Interface, and to seperate implementation code from headers.