I am new to virtual functions in c++. To understand them I created two classes : CommissionEmployee(Employee gets commission on sale - Base class) and BaseplusCommissionEmployee(Gets a base salary as well - Derived class).
I declared the functions print() and earning in both classes as virtual. But at compilation I get the following error : undefined reference to `vtable for CommissionEmployee'
Following this answer(Linking error: undefined reference to `vtable for XXX`) I got some idea that I should define non pure virtual functions during declaration itself. But I separate the class definition and function definitions into separate header and cpp file. So should I define the virtual function in header wouldn't it give compilation error?
header file for CommissionEmployee :
#ifndef CommissionEmployee_h // CommissionEmployee_inheritance.h
#define CommissionEmployee_h
#include<string>
using namespace std;
class CommissionEmployee
{
    public :
    CommissionEmployee(const string&, const string&, const string&, double =0.0, double =0.0);
    void setfirstname(const string &name);
    void setlastname(const string &name);
    void setsocialsecuritynum(const string&);
    void setgrosssales(double );
    void setcommisionrate(double);
    
    string getfirstname() const;
    string getlastname() const;
    string getsocialsecuritynum() const;
    double getgrosssales() const;
    double getcommisionrate() const;
    virtual double earning() const;
    virtual void print() const;
    private :
    string firstname;
    string lastname;
    string socialsecuritynum;
    double grosssales;
    double commisionrate;
};
#endif
Header for BaseplusCommissionEmployee :
#include"CommissionEmployee_inheritance.h"
class BaseplusCommissionEmployee : public CommissionEmployee
{   
    public:
    BaseplusCommissionEmployee(const string&, const string&, const string&,double=0 , double=0, double=0);
    
    void setbasesalary(double);
    
    double getbasesalary() const;
    virtual double earning() const;
    virtual void print() const;
    private:
  
    double basesalary;
};
