I have a base class Media and several derived classes, namely DVD, Book, etc…
The base class is written as:
class Media{
private:
int id;
string title;
int year;
public:
Media(){ id = year = 0; title = ""; }
Media(int _id, string _title, int _year): id(_id), title(_title), year(_year) {}
// virtual ~Media() = 0;
void changeID(int newID){ id = newID; }
virtual void print(ostream &out);
};
The thing is: without the destructor, GCC gives me a bunch of warnings class has virtual functions but non-virtual destructor, but still compiles and my program works fine. Now I want to get rid of those annoying warnings so I satisfy the compiler by adding a virtual destructor, the result is: it doesn’t compile, with the error:
undefined reference to `Media::~Media()`
Making the destructor pure virtual doesn’t solve the problem.
So what has gone wrong?
You need to also define the virtual destructor, not only add it.
The reason you get the warnings is that all classes that will be derived from should have a virtual or protected (credit @Steve) destructor, otherwise deleting an instance via a pointer to a base class results in undefined behavior.
Note you HAVE TO provide a definition for destructors, even if they are pure virtual.