C++/따배C++ 11강 상속

[C++/11.02] 상속 기본 2

polarcompass 2021. 11. 6. 23:01
728x90

1. main.cpp

#include "Student.h"
#include "Teacher.h"

using namespace std;

int main()
{

    Student std("Jack Jack");
    std.setName("Jack Jack 2");
    std.getName();

    Teacher teacher1("Dr. H");
    teacher1.setName("Dr. K");

    cout << teacher1.getName() << endl;

    cout << std << endl;

    std.doNothing();
    teacher1.doNothing();

    std.study();
    teacher1.teach();

    Person person;
    person.setName("Mr. Incredible");
    person.getName();
    person.doNothing();

    // 자식 함수를 부모가 쓸 수는 없다.
    // person.study();
    // person.teach();

    return 0;
}

2. Person.h

#pragma once

#include <string>
#include <iostream>

class Person
{
private:
    std::string m_name;

public:
    // Person()
    //     : m_name("No name")
    // {}

    Person(const std::string &name_in = "No Name")
        : m_name(name_in)
    {
    }

    void setName(const std::string &name_in)
    {
        m_name = name_in;
    }

    std::string getName() const
    {
        return m_name;
    }

    void doNothing() const
    {
        std::cout << m_name << " is doing nothing." << std::endl;
    }
};

3. Student.h

#pragma once

// #include <iostream>
// #include <string>
#include "Person.h"

class Student : public Person
{
private:
    int m_intel; // intelligence; 지능

    // TODO : add more members like address, phone, favorate food, habits,...
public:
    Student(const std::string &name_in = "No Name", const int &intel_in = 0)
        // : m_name(name_in), m_intel(intel_in)
        : Person(name_in)
        , m_intel(intel_in)
    {}

    void setIntel(const int &intel_in)
    {
        m_intel = intel_in;
    }

    int getIntel()
    {
        return m_intel;
    }

    void study()
    {
        std::cout << getName() << " is studying " << std::endl;
    }

    friend std::ostream &operator<<(std::ostream &out, Student &student)
    {
        out << student.getName() << " " << student.m_intel;
        return out;
    }
};

4. Teacher.h

#pragma once

// #include<string>
#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 " << std::endl;
    }

    friend std::ostream &operator<<(std::ostream &out, Teacher &teacher)
    {
        // out << teacher.m_name;
        out << teacher.getName();
        return out;
    }
};
728x90