열혈 C++ 프로그래밍의 상속 파트를 포스팅해보겠다.
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
class PermanentWorker
{
private:
char name[100];
int salary;
public:
PermanentWorker(const char name[100], int money)
:salary(money)
{
strcpy(this->name, name);
}
int GetPay() const {
return salary;
}
void ShowSalaryInfo() const {
cout << "name : " << name << endl;
cout << "salary : " << GetPay() << endl << endl;
}
};
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];
}
}
};
int main()
{
EmployeeHandler handler;
// 직원 관리 목적으로 설계된 컨트롤 클래스의 객체 생성
//직원 등록
handler.AddEmployee(new PermanentWorker("Kim", 1000));
handler.AddEmployee(new PermanentWorker("min", 2000));
handler.ShowAllSalaryInfo();
handler.ShowTotalSalary();
return 0;
}
PermanentWorker 에서 정규직 사원들의 name과 salary 정보를 저장한다.
EmployHandler에서 각각의 사원들을 List에 담고, 사원들이 이름과 급여 정보, 그리고 총 급여의 정보를 출력한다.
근데 만약에 정규직 사원뿐만 아니라 영업직 사원, 임시직 사원이 생긴다면 이에 맞추어 EmployHandler을 어떻게 수정해야하나? 클래스를 따로 생성해서 해당 클래스 객체를 담을 배열과 생성자, for문을 만들어야 되는 것이다. 이런 형태는 매우 복잡하기 때문에 상속을 사용해 문제를 해결해보자.
상속이란?
부모 클래스의 멤버 변수와 멤버 함수를 자식 클래스가 그대로 가져와 쓰는 것을 의미한다.
자식 클래스는 넘겨 받은 변수를 초기화할 의무가 있고, 이 초기화는 부모 클래스의 생성자를 통해 가능하다.
#include <iostream>
#pragma warning(disable:4996)
using namespace std;
class Person
{
private:
int age;
char name[50];
public:
Person(int myage, const char myname[50])
:age(myage)
{
strcpy(name, myname);
}
void WhatYourName()const
{
cout << "My name is " << name << endl;
}
void HowOldAreYou() const
{
cout << "I'm " << age << " years old" << endl;
}
};
class UnivStudent
:public Person
{
private:
char major[50];
public:
UnivStudent(const char myname[50] , int myage, const char mymajor[50])
:Person(myage, myname)
{
strcpy(major, mymajor);
}
void WhoAreYou() const {
WhatYourName();
HowOldAreYou();
cout << " my major is " << major << endl;
}
};
int main()
{
UnivStudent ustd1("Lee", 22, "Computer eng. ");
ustd1.WhoAreYou();
UnivStudent ustd2("Kim", 20, "Information eng. ");
ustd2.WhoAreYou();
return 0;
}
이렇게 하면 된다잉
#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;
class Person {
private:
char* name;
public:
Person(char* myname)
{
name = new char[strlen(myname) + 1]; // name변수에 메모리 공간 할당
strcpy(name, myname);
}
~Person()
{
delete[]name; // 메모리 공간 해제
}
void WhatYourName() const
{
cout << "My name is " << name << endl;
}
};
class UnivStudent
:public Person
{
private:
char* major;
public:
UnivStudent(char* myname, char* mymajor)
:Person(myname)
{
major = new char[strlen(mymajor) + 1];
// 유도클래스의 메모리공간만을 할당하고 해제한다.
strcpy(major, mymajor);
}
~UnivStudent()
{
delete[]major;
}
void WhoAreYou() const {
WhatYourName();
cout << "My major is " << major << endl << endl;
}
};
int main()
{
UnivStudent st1("kim", "Mathmatics");
st1.WhoAreYou();
UnivStudent st2("hong", "Physics");
st2.WhoAreYou();
return 0;
}
문제 1
#include <iostream>
using namespace std;
class Car
{
private:
int gasolineGauge;
public:
Car(int a)
:gasolineGauge(a)
{ }
int GetGasGauge()
{
return gasolineGauge;
}
~Car()
{}
};
class HybridCar
:public Car {
private:
int electricGauge;
public:
HybridCar(int a,int b)
:Car(a), electricGauge(b) {}
int GetElecGauge() {
return electricGauge;
}
~HybridCar()
{}
};
class HybridWaterCar
: public HybridCar
{
private:
int waterGauge;
public:
HybridWaterCar(int a, int b, int c)
:HybridCar(a, b), waterGauge(c) {}
void ShowCurrentGauge() {
cout << "잔여 가솔린 : " << GetGasGauge() << endl;
cout << "잔여 전기량 : " << GetElecGauge() << endl;
cout << "잔여 워터량 : " << waterGauge << endl;
}
~HybridWaterCar()
{}
};
int main()
{
HybridWaterCar hybridwatercar(20, 30, 100);
hybridwatercar.ShowCurrentGauge();
}
main 함수 확인하기
문제2
#include <iostream>
using namespace std;
class MyFriendInfo {
private:
char* name;
int age;
public:
MyFriendInfo(char* myname, int myage)
: age(myage)
{
name = new char[strlen(myname) + 1];
strcpy(name, myname);
}
void ShowMyFriendInfo()
{
cout << "이름 : " << name << endl;
cout << "나이 : " << age << endl;
}
~MyFriendInfo()
{
delete[]name;
}
};
class MyFriendDetailInfo
:public MyFriendInfo
{
private:
char* addr;
char* phone;
public:
MyFriendDetailInfo(char* myname, int myage, char* myaddr, char* myphone)
:MyFriendInfo(myname,myage)
{
addr = new char(strlen(myaddr) + 1);
strcpy(addr, myaddr);
phone = new char(strlen(myphone) + 1);
strcpy(phone, myphone);
}
void ShowMyFriendDetailInfo()
{
ShowMyFriendInfo();
cout << "주소 : " << addr << endl;
cout << "전화 : " << phone << endl;
}
~MyFriendDetailInfo() {
delete[]addr;
delete[]phone;
}
};
int main()
{
MyFriendDetailInfo person("kim", 10, "경상북도 경산시", "010-0000-0000");
person.ShowMyFriendDetailInfo();
return 0;
}
'Langauge > C++' 카테고리의 다른 글
Constructor and Separating Files (0) | 2021.03.18 |
---|---|
Introduction to classes and objects #1 (0) | 2021.03.10 |
[열혈 C++ 프로그래밍] Chapter06 (friend와 static그리고 const) 정리 및 문제 해결 (0) | 2021.02.18 |
[열혈 C++ 프로그래밍] Chapter05(복사 생성자) 정리 및 문제 해결 (0) | 2021.02.16 |
[열혈 C++ 프로그래밍] Chapter04(클래스의 완성) 정리 및 문제 해결 #2 (0) | 2021.02.14 |