regular 클래스는 employee 클래스의 이름, 주소에 대한 멤버 변수들을 상속받음
이러한 부모 클래스와 자식 클래스 간의 관계를 '상속성'이라고 한다.
상속 클래스의 객체 생성 및 소멸 코드는 아래 코드를 참고
#include<iostream>
using namespace std;
class Staff {
public:
Staff() {
this->strName = NULL;
this->strAddr = NULL;
cout << "1. Staff 디폴트 생성자 호출" << endl;
}
Staff(const char* pName, const char*pAddr) {
cout << "1. Staff 전달인자 2개와 생성자 호출" << endl;
this->strName = new char[strlen(pName)+1];
this->strAddr = new char[strlen(pAddr) + 1];
strcpy_s(this->strName, strlen(pName) + 1, pName);
strcpy_s(this->strAddr, strlen(pAddr) + 1, pAddr);
}
~Staff() {
delete[] strName;
delete[] strAddr;
cout << "1. Staff 소멸자 호출" << endl;
}
protected:
char* strName;
char* strAddr;
};
class Permanent : Staff {
public:
Permanent(const char* pName, const char* pAddr, double dSalary) {
cout << "2. Permanent 인자가 3개인 생성자 호출" << endl;
this->strName = new char[strlen(pName) + 1];
this->strAddr = new char[strlen(pAddr) + 1];
strcpy_s(this->strName, strlen(pName) + 1, pName);
strcpy_s(this->strAddr, strlen(pAddr) + 1, pAddr);
salary = dSalary;
}
~Permanent() {
cout << "2. Permanent 소멸자 호출" << endl;
}
double PayCheck() const {
return salary;
}
private:
double salary;
};
class Temporary : Staff {
public:
Temporary(const char* pName, const char* pAddr, double dDailyPayCheck, int nDays) : Staff(pName, pAddr) {
cout << "3. Temporary 인자가 4개인 생성자 호출 " << endl;
dailyPayCheck = dDailyPayCheck;
days = nDays;
}
~Temporary() {
cout << "3. Temporary 소멸자 호출 " << endl;
};
double PayCheck() const {
return dailyPayCheck * days;
}
private:
double dailyPayCheck;
int days;
};
void main() {
Permanent rgl("kim", "suwon", 300);
Temporary tmp("park", "seoul", 10, 20);
cout << rgl.PayCheck() << endl;
cout << tmp.PayCheck() << endl;
}
상기 코드에서 자식 속성에 ": 부모속성(매개변수)"을 붙여주게 되면 부모 클래스에서 어떤 생성자를 호출해서 상속 받을지를 명확히 할 수 있다.
출력 결과 값
클래스 멤버 변수로 사용 시

오버라이딩
사전적 의미로 '~위에 덮어쓰다' 또는 '~에 우선한다'는 의미
즉, 부모 클래스에서 정의한 멤버 함수를 자식 클래스가 그대로 상속받되, 내용을 변경하여 새로운 기능을 만드는 것
멤버 함수 오버라이딩 조건
1. 이름이 같아야 한다.
2. 매개변수의 타입 및 개수가 닽아야 한다.
3. 반환 타입이 같아야 한다.
이 말인 즉슨, 부모와 자식의 함수가 동일해야 한다는 것을 의미한다.
코드로 예시를 들어 보면
class Staff {
public:
Staff() {
this->strName = NULL;
this->strAddr = NULL;
}
Staff(const char* pName, const char*pAddr) {
this->strName = new char[strlen(pName)+1];
this->strAddr = new char[strlen(pAddr) + 1];
strcpy_s(this->strName, strlen(pName) + 1, pName);
strcpy_s(this->strAddr, strlen(pAddr) + 1, pAddr);
}
~Staff() {
delete[] strName;
delete[] strAddr;
}
double PayCheck() const {
return 0.0;
}
protected:
char* strName;
char* strAddr;
};
class Permanent : Staff {
public:
Permanent() {}
Permanent(const char* pName, const char* pAddr, double dSalary) : Staff(pName, pAddr) {
salary = dSalary;
}
~Permanent() {
}
double PayCheck() const {
return salary;
}
private:
double salary;
};
class SalesMan : Permanent {
public:
SalesMan() {
}
SalesMan(const char* pName, const char* pAddr, double dSalary, double dAllowance) : Permanent(pName, pAddr, dSalary) {
allowance = dAllowance
}
~SalesMan() {
}
double PayCheck() const {
return Permanent::PayCheck() + allowance;
}
private:
double allowance;
};
void main() {
SalesMan slm("jung", "boondang", 300, 50);
cout << "급여: " << slm.PayCheck() << endl;
}
위 코드를 살펴보면 Staff 클래스가 Permanent에 이름과 주소 그리고 PayCheck() 함수를 내려주고 해당 값을 상속받은 Permanent가 다시 SalesMan에 Salary값을 포함하여 다시 내려주고 있다.
따라서, 메인에서 호출한 SalesMan 클래스의 PayCheck가 Permanent의 PayCheck를 오버라이딩해서 Permanent의 PayCheck 함수의 기능에 '+ allowance' 한 값인 "350"을 결과값으로 return하는 것이다.

Staff* emp = (Staff*)&rgl;
emp->PayCheck();
cout << emp->PayCheck() << endl;
우리가 배운 대로라면 위 코드에서 emp가 호출하는 PayCheck( )는 누구의 함수가될까??
나는 Permanent의 PayCheck( ) 함수가 호출될 것이라고 예상한다.
emp는 어디까지나 Staff 타입을 가져올 뿐 직접적으로 생성하고 있는 객체는 Permanent이기 때문에 해당 객체를 생성하면서 Staff의 함수는 오버라이딩 되었을 것이라고 예상하기 때문이다.