Virtual

C++ 2021. 1. 22. 18:10
#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
Posted by khon98
,