I have A base class in this file:
#ifndef MTM_CHARACTER_H_
#define MTM_CHARACTER_H_
#include "Exceptions.h"
#include "Auxiliaries.h"
#include <memory>
namespace mtm
{
    
  class Character
  {
      protected:
              int health
               
      public:
              
             Character(int health): health(health){}
             virtual Character* clone() const = 0;
        
};
}
#endif
and then I have derived class:
#ifndef MTM_SNIPER_H_
#define MTM_SNIPER_H_
#include "Character.h"
#include <memory>
namespace mtm
{
 
 class Sniper: public Character
 {
     private:
            units_t successful_attack;
   public:
    Sniper(int health,units_t successful_attack=0): 
    Character(health), successful_attack(successful_attack){}
    virtual Character* clone() const override
    {
          return  new Sniper(*this) ;
    }
 
};
}
#endif
and no matter what I do I keep getting these errors:
/tmp/cc5TyEEH.o:(.gcc_except_table+0xbc): undefined reference to `typeinfo for mtm::Character'
/tmp/ccbNL933.o: In function `mtm::Character::Character(mtm::Character const&)':
/home/raghad-a/mtm3_3/Character.h:25: undefined reference to `vtable for mtm::Character'
/tmp/ccbNL933.o:(.rodata._ZTIN3mtm5MedicE[_ZTIN3mtm5MedicE]+0x10): undefined reference to `typeinfo for mtm::Character'
/tmp/ccrnaFqr.o:(.rodata._ZTIN3mtm6SniperE[_ZTIN3mtm6SniperE]+0x10): undefined reference to `typeinfo for mtm::Character'
/tmp/ccGBmaWP.o:(.rodata._ZTIN3mtm7SoldierE[_ZTIN3mtm7SoldierE]+0x10): undefined reference to `typeinfo for mtm::Character'
/tmp/ccyu18Hf.o: In function `mtm::Character::Character(int, int, int, int, mtm::Team, mtm::CharacterType)':
/home/raghad-a/mtm3_3/Character.h:23: undefined reference to `vtable for mtm::Character'
collect2: error: ld returned 1 exit status
I looked for every question about this kind of problem in this website and none of them solved the problem.
the way I used Sniper
std::shared_ptr<Sniper> ptr(new Sniper(health)); std::shared_ptr<Sniper> other_ptr(new Sniper(health));
the way I used clone:
ptr=static_cast<std::shared_ptr<Character>>(other_ptr->clone());
 
    