c++ 상속의 이해

‍정진철·2022년 9월 18일
0

C++

목록 보기
15/18

출처 : 윤성우의 열혈 c++ 프로그래밍

상속에 들어가기 앞서

직원 정보 클래스

직원 핸들러 클래스

class EmployeeHandler
{
private:
    PermanentWorker *empList[50];
    int empNum;

public:
    EmployeeHandler() : empNum(0) {}

    void AddEmployee(PermanentWorker *emp)
    {
        empList[empNum++] = emp;
    }

    void ShowAllSalaryInfo() const
    {
        for (int i = 0; i < empNum; i++)
            empList[i]->ShowSalaryInfo();
    }
    void ShowTotalSalary() const
    {
        int sum = 0;
        for (int i = 0; i < empNum; i++)
            sum += empList[i]->GetPay();
        cout << "salary sum: " << sum << endl;
    }
    ~EmployeeHandler()
    {
        for (int i = 0; i < empNum; i++)
        {
            delete empList[i];
        }
    }
};
  • PermanentWorker 클래스는 데이터적 성격이 강하고 EmployeeHandler 클래스는 '기능적' 성격이 강하다. 쉽게 말해 기록의 보전을 위해 파일에 저장할 데이터를 가지고 있는것은 PermanetWorker 객체인 반면, EmployeeHandler 객체는 프로그램을 구성하는 대표적인 기능을 처리하는 클래스다

-> 이렇게 기능의 처리를 실제로 담당하는 클래스를 가리켜 '컨트롤(control) 클래스 또는 '핸들러(handler)클래스' 라 한다.


상속의 문법적인 이해

Person 클래스

class Person
{
private:
    int age;
    char name[50];

public:
    Person(char *myname, int myage) : age(myage)
    {
        strcpy(name, myname);
    }
    void WhatYourName() const
    {
        cout << "My name is " << name << endl;
    }

    void HowOldAreYou() const
    {
        cout << "My age is " << age << endl;
    }
};

UnivStudent 클래스

class UnivStudent : public Person
{
private:
    char major[50];

public:
    UnivStudent(char *myname, int myage, char *mymajor) : Person(myage, myname);
    {
        strcpy(major, mymajor);
    }
    void WhoAreYou() const
    {
        WhatYourName();
        HowOldAreYou();
        cout << "My major is " << major << endl;
    }
};
  • Person 클래스를 상속함. ( :public Person)
  • Person 클래스에서 whatYourName, HowOldAreYou 함수 가져옴
  • 부모 클래스를 상속받은 자식 클래스는 부모클래스 객체를 초기화할 책임질 인자를 전달함.
  • Person: 상위클래스, 부모클래스 / UnivStudent : 하위 클래스, 자식클래스
  • UnivStudent 는 Person 클래스를 상속받았을지라도 Person 클래스의 private 멤버변수에는 접근불가.
  • 따라서 생성자 초기화를 통해 멤버변수에 접근하게끔 해야함.

Protected 선언과 세 가지 형태의 상속

  • Protected는 Private과 달리 상속받은 클래스에서 접근 가능 하도록 한다. (단 public으로 상속받았을 경우 한정)

  • public 상속: private 접근불가, protected,public 멤버 -> 접근 제어 권한 그대로 상속.
  • protected 상속: private 접근불가, protected,public 멤버 -> protected 타입으로 변경됨.
  • private 상속: private 접근불가 , protected, public 멤버 -> private 타입으로 변경됨.


업로드중..


상속을 위한 조건

상속을 위한 기본 조건인 IS - A 관계의 성립

  • "무선 전화기는 일종의 전화기 입니다 "
  • "노트북 컴퓨터는 일종의 컴퓨터 입니다"

-> 무선 전화기 " is a " 전화기
-> 노트북 컴퓨터 "is a" 컴퓨터

#include <iostream>
#include <cstring>
using namespace std;

class Computer
{
private:
    char owner[50];

public:
    Computer(char *name)
    {
        strcpy(owner, name);
    }

    void Calculate()
    {
        cout << "요청 내용을 계산합니다." << endl;
    }
};

class NotebookComp : public Computer
{
private:
    int Battery;

public:
    NotebookComp(char *name, int initChag) : Computer(name), Battery(initChag) {}
    void Charging { Battery += 5; }
    void UseBattery { Battery -= 1; }
    void MovingCal()
    {
        if (GetBatteryInfo() < 1)
        {
            cout << "충전이 필요합니다" << endl;
            return;
        }
        cout << "이동하면서";
        Calculate();
        UseBattery();
    }
    int GetBatteryInfo() { return Battery; }
};

class TabletNotebook : public NotebookComp
{
private:
    char regstPenModel[50];

public:
    TabletNotebook(char *name, int initChag, char *pen) : NotebookComp(name, initChag)
    {
        strcpy(regstPenModel, pen);
    }
    void Write(char *penInfo)
    {
        if (GetBatteryInfo() < 1)
        {
            cout << "충전이 필요합니다" << endl;
            return;
        }
        if (strcmp(regstPenModel, penInfo) != 0)
        {
            cout << "등록된 펜이 아닙니다" < endl;
            return;
        }
        cout << "필기 내용을 처리합니다." << endl;
        UseBattery();
    }
};

int main(void)
{
    NotebookComp nc("정진철", 5);
    TabletNotebook tn("정진철", 6, "ISE-231-223");
    nc.MovingCal();
    tn.Write("ISE-231-223");
    return 0;
}

HAS - A 관계의 상속

  • 상속으로 표현하지 않음
  • class Gun을 참조 할 수 있는 멤버변수로 선언
  • Gun 객체 생성. ( Gun * pistol; )
  • 포인터를 이용해 멤버변수로 사용하면 포함 할 수도 그렇지 않은 경우를 나누기가 용이해짐.
#include <iostream>
#include <cstring>
using namespace std;

class Gun
{
private:
    int bullet;

public:
    Gun(int bnum) : bullet(bnum) { }
    
    void Shot()
    {
        cout << "BBANG !!" << endl;
        bullet--;
    }
}

class Police
{
private:
    int handcuffs;
    Gun * pistol;

public: 
    Police(int bnum, int bcuff) : handcuffs(bcuff)
    {
        if(bnum > 0)
            pistol = new Gun(bnum);
        else
            pistol = NULL;
    }
    
    void PutHandcuff()
    {
        cout <<"SNAP!" << endl;
        handCuff --;
    }
    void Shot()
    {
        if(pistol == NULL)
        
            cout << "Hut BBANG!! " << endl;
        else
            pistol->Shot();
    
    }
    ~Poilce()
    {
        if(pistol != NULL)
            delete pistol;
    }
};

int main(void)
{
    Police pman1(5,3);
    pman1.Shot();
    pman1.PutHandcuff();

    Police pman2(0,3);
    pman2.Shot();
    pman2.PutHandcuff();
    return 0;
}

profile
WILL is ALL

0개의 댓글