In this HackerRank Virtual functions problem in c++ programming language, you need to Create three classes Person, Professor, and Student. The class Person should have data members' names and ages. The classes Professor and Student should inherit from the class Person.

HackerRank Virtual Functions solution in c++ programming


HackerRank Virtual Functions problem solution in c++ programming.

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Person {
public:
    string name;
    int age;
    virtual void getdata() {
        cin >> this->name >> this->age;
    }
    virtual void putdata() {
        cout << this->name << " " << this->age << endl;
    }
};

class Professor : public Person {
public:
    Professor() {
        this->cur_id = ++id;
    }
    int publications;
    static int id;
    int cur_id;
    void getdata() {
        cin >> this->name >> this->age >> this->publications;
    }
    void putdata() {
        cout << this->name << " "
            << this->age << " "
            << this->publications << " "
            << this->cur_id << endl;
    }
};
int Professor::id = 0;

class Student : public Person {
#define NUM_OF_MARKS 6
public:
    Student() {
        this->cur_id = ++id;
    }
    int marks[NUM_OF_MARKS];
    static int id;
    int cur_id;
    void getdata() {
        cin >> this->name >> this->age;
        for (int i=0; i<NUM_OF_MARKS; i++) {
            cin >> marks[i];
        }
    }
    void putdata() {
        int marksSum = 0;
        for (int i=0; i<NUM_OF_MARKS; i++) {
            marksSum += marks[i];
        }
        cout << this->name << " "
            << this->age << " "
            << marksSum << " "
            << this->cur_id << endl;
    }
};
int Student::id = 0;
int main(){

    int n, val;
    cin>>n; //The number of objects that is going to be created.
    Person *per[n];

    for(int i = 0;i < n;i++){

        cin>>val;
        if(val == 1){
            // If val is 1 current object is of type Professor
            per[i] = new Professor;

        }
        else per[i] = new Student; // Else the current object is of type Student

        per[i]->getdata(); // Get the data from the user.

    }

    for(int i=0;i<n;i++)
        per[i]->putdata(); // Print the required output for each object.

    return 0;

}

Second solution

class Person{
    protected:
    string name;
    int age;
    
    public:
    virtual void getdata()=0;
    virtual void putdata()=0;
};

class Professor: public Person{
    int publications;
    int cur_id;
    
    static int total_id;
    
    public:
    Professor(){
        total_id++;
        cur_id = total_id;
    }
    virtual void getdata(){
        cin >> name >> age >> publications;
    }
    virtual void putdata(){
        cout << name << " " << age << " " << publications << " " << cur_id << "\n";
    }
    
};

class Student: public Person{
    int marks[6];
    int cur_id;
    
    static int total_id;
    
    public:
    Student(){
        total_id++;
        cur_id = total_id;
    }
    virtual void getdata(){
        cin >> name >> age;
        for(int i=0; i<6; i++)cin >> marks[i];
    }
    virtual void putdata(){
        int mark_total=0;
        for(int i=0; i<6; i++)mark_total += marks[i];
        cout << name << " " << age << " " << mark_total << " " << cur_id << "\n";
    }
    
};
int Professor::total_id=0;
int Student::total_id=0;