Person header

#pragma once

#include <string>
#include <iostream>

class Person
{
private:
    std::string m_name;

public:
    Person(const std::string & name_in = "No Name")
        : m_name(name_in)
    {}
    
    void setName(const std::string & name_in) // Teacher,Student는 m_name에 접근이 불가능하므로(private이라) Person에 옮겨옴.
    {
        m_name = name_in;
    }
    
    std::string getName() const // Student에서 const로 받기 때문에 뒤에 const를 붙여줘야한다.
    {
        return m_name;
    }
    
    void doNothing() const
    {
        cout << m_name << " is doing Nothing" << "\n";
    }
    
};

Teacher header

#pragma once
#include "Person.h"

class Teacher : public Person
{
private:
    
public:
    Teacher(const std::string & name_in = "No Name")
        : Person(name_in)
    {}
    
    void teach()
    {
        std::cout << getName() << " is teaching" << "\n";
    }
    
    
    
    friend std::ostream & operator << (std::ostream & out, const Teacher & teacher)
    {
        //out << teacher.m_name;
        out << teacher.getName();
        return out;
    }
};

Student Header

#pragma once

#include "Person.h"

class Student : public Person
{
private:
    int m_intel; //intelligence;
    
public:
    Student(const std::string & name_in = "No Name", const int & intel_in = 0)
        //: m_name(name_in), m_intel(intel_in) // m_name은 Person에 속해있으므로 Person에서 생성자를 만들어줘야한다.
        : Person(name_in), m_intel(intel_in)
    {}
     
    void study()
    {
        std::cout << getName() << "is studying" << "\n";
    }
    
    void setIntel(const int & intel_in)
    {
        m_intel = intel_in;
    }
    
    int getIntel()
    {
        return m_intel;
    }
    
    friend std::ostream & operator << (std::ostream & out, const Student & student)
    {
        //out << studnet.m_name << " " << student.m_intel;
        out << studnet.getName() << " " << student.m_intel;
        return out;
    }
};
#include "Student.h"
#include "Teacher.h"

int main()
{
	std::string name;
    Student std("Jack Jack");
    std.setName("Jack Jack2");
    std.getName();
    
    Teacher teacher1("Dr. H");
    teacher1.setName("Dr. K");
    
    std::cout << teacher1.getName() << "\n";
    
    std.doNothing();
    teacher1.doNothing();
    
    std.study();
    teacher1.teach();
    
    Person person;
    person.setName("Mr. Incredible")
    
    //person.study() 부모는 자식의 것을 쓰지 못한다.
    
    return 0;
}