#include <iostream>
using namespace std;
class Employee { // 부모 클래스
protected:
long BaseSalary;
public:
Employee();
virtual void GetSalary();
};
class Manager : public Employee { // 파생 클래스
protected:
long ManagerSalary;
public:
Manager();
void GetSalary();
};
class Salesman : public Employee { // 파생 클래스
protected:
long SalesSalary;
public:
Salesman();
void GetSalary();
};
class Temporary : public Employee { // 파생 클래스
protected:
long TempSalary;
public:
Temporary();
void GetSalary();
};
void Employee::GetSalary() {
cout << " 사원 기본급 = " << BaseSalary << endl;
}
void Manager::GetSalary() {
cout << " 사원 기본급 + 직급 수당 = " << (BaseSalary + ManagerSalary) << endl;
}
void Temporary::GetSalary() {
cout << " 사원 기본급 + 계약 수당 = " << (BaseSalary + TempSalary) << endl;
}
void Salesman::GetSalary() {
cout << " 사원 기본급 + 영업 수당 = " << (BaseSalary + SalesSalary) << endl;
}
Employee::Employee() { BaseSalary = 500000; }
Manager::Manager() { ManagerSalary = 300000; }
Salesman::Salesman() { SalesSalary = 200000; }
Temporary::Temporary() {TempSalary = 100000; }
int main(int argc, const char * argv[]) {
Employee E, *ptrE;
Manager M;
Salesman S;
Temporary T;
ptrE = &E; ptrE->GetSalary();
ptrE = &M; ptrE->GetSalary();
ptrE = &S; ptrE->GetSalary();
ptrE = &T; ptrE->GetSalary();
return 0;
}
실행 결과
사원 기본급 = 500000
사원 기본급 + 직급 수당 = 800000
사원 기본급 + 영업 수당 = 700000
사원 기본급 + 계약 수당 = 600000
---------------------------------------------
#include <iostream>
#include <string>
using namespace std;
class Member { // 부모 클래스
char *name;
public:
Member(char *irum) { // 부모 클래스의 생성자
name = new char[strlen(irum) + 1];
strcpy(name, irum);
}
~Member() { // 부모 클래스의 소멸자
cout << " Member 소멸자 호출 " << endl;
delete []name;
}
virtual void print() {
cout << " 이름 : " << name << endl;
}
};
class CallBonus : public Member { // 파생 클래스
private:
char *id;
int this_month;
int special;
int accumulation;
public:
CallBonus(char *a, char *b, int c, int d, int e) :Member(a) { // 파생 클래스 생성자
id = new char[strlen(b) + 1];
strcpy(id, b);
this_month = c;
special = d;
accumulation = e;
}
~CallBonus() { // 파생 클래스 소멸자
cout << " CallBonus 소멸자 호출 " << endl;
delete []id;
}
void print() {
Member::print();
cout << " 주민등록번호 : " << id << endl;
cout << " 당월 : " << this_month << endl;
cout << " 특별 : " << special << endl;
cout << " 누적 : " << accumulation << endl;
}
};
int main(int argc, const char * argv[]) {
Member *ptr;
ptr = new CallBonus("khon", "111111-1234567", 200, 100, 1000);
ptr->print();
delete ptr;
return 0;
}
실행 결과
이름 : khon
주민등록번호 : 111111-1234567
당월 : 200
특별 : 100
누적 : 1000
Member 소멸자 호출
9행
- 부모 클래스 Member의 생성자 함수에 동적 메모리 할당 코드가 있기 때문에 소멸자에서 메모리 제거 코드가 만들어짐
24 ~ 42행
- 파생 클래스 CallBonus도 생성자에서 동적 메모리 할당 코드가 있고 파생 클래스의 소멸자에서는 할당된 영역을 제거하는 코드가 있음
55행
- 내용이 수행되면 최초로 부모 클래스의 생성자 함수가 호출되면서 데이터 멤버 name에 대한 메모리가 할당되고 다음에 파생 클래스의 생성자 함수가 호출되면서 데이터 멤버 id, this_month, special, accumulation에 대한 동적 메모리가 할당됨
57행
- 생성자가 호출되고 나서 delete ptr 코드에 의해서 소멸자가 호출, 먼저 파생 클래스의 소멸자가 호출되면서 할당된 메모리를 제거하고 다음에 부모 클래스의 소멸자가 호출되면서 할당된 메모리를 제거해야 함
- 결과를 보면 부모 클래스의 소멸자만 호출되는 것을 확인할 수 있음
- 이러한 문제는 가상 소멸자를 사용해서 해결할 수 있음
'C++' 카테고리의 다른 글
가상 함수에서 메서드 호출 (0) | 2021.01.23 |
---|---|
Swap (0) | 2021.01.22 |
범위(Scope) (0) | 2021.01.21 |
포인터 연산자 예제 (0) | 2021.01.21 |
예제1 (0) | 2021.01.21 |