I was trying to learn operator overloading in C++ PL. I made an exercise shown below. What I want to do is overload << operator for each derived class and use it on my main. But whenever I do it, its only working for Base class. What is the problem here?
Class Employee:
class Employee {
public:
    string name;
    int id;
    int exp_level;
    double salary;
    Employee() {
        this->name = "";
        this->id = 0;
        this->exp_level = 0;
        this->salary = 0.0;
    }
    ~Employee() {
        //WTF
    }
    virtual void calculateSalary() {
        //CODE
    }
    
    virtual void registerX() {
        //CODE
    }
    friend ostream& operator<<(ostream& os, const Employee& e) {
        os << e.name << " " << e.exp_level << " " << e.id << " " << e.salary << endl;
        return os;
    }
};
Class Technical:
class Technical : public Employee {
public:
    string profession;
    Technical() {
        this->profession = "";
    }
    ~Technical() {
    }
    virtual void calculateSalary() {
        //CODE
    }
    virtual void registerX() {
        //CODE
    }
    friend ostream& operator<<(ostream& os, const Technical& e) {
        os << e.name << " " << e.exp_level << " " << e.id << " " << e.salary << "Technical" << endl;
        return os;
    }
};
Class Engineer:
class Engineer : public Employee {
public:
    Engineer() {
    }
    ~Engineer() {
    }
    virtual void calculateSalary() {
        //CODE
    }
    virtual void registerX() {
        //CODE
    }
    friend ostream& operator<<(ostream& os, const Engineer& e) {
        os << e.name << " " << e.exp_level << " " << e.id << " " << e.salary << "Engineer" << endl;
        return os;
    }
};
Main Method:
int main()
{
    Employee* e = new Employee();
    Employee* t = new Technical();
    Employee* ee = new Engineer();
    cout << *e << endl;
    cout << *t << endl;
    cout << *ee << endl;    
}    
Output:
 0 0 0
 0 0 0
 0 0 0
 
     
    