상속
- 코드를 재사용하는 방법
- 규모 확장
- 관계의 한가지 유형
기본 문법
//class 파생클래스이름 : 접근제어지시자 부모클래스이름
class CMyData
{
};
class CMyDataEx : public CMyData
{
};
※ 자식 클래스 선언 시 자식 클래스의 생성자보다 부모 클래스의 생성자가 먼저 실행됨
참조 형식과 실 형식
class CMyData
{
public:
CMyData()
{
cout << "CMyData()" << endl;
}
void TestFunc(void)
{
cout << "CMyData::TestFunc()" << endl;
}
};
class CMyDataEx : public CMyData
{
public:
CMyDataEx()
{
cout << "CMyDataEx()" << endl;
}
void TestFunc(void)
{
cout << "CMyDataEx::TestFunc()" << endl;
}
};
//파생형식은 기본형식으로 pointing이 가능
int main() {
CMyDataEx a;
CMyData &b = a;
b.TestFunc();
return 0;
}
- 일반 함수 - 참조 형식
- 가상 함수 - 실 형식
생성자
- 부모 클래스의 생성자가 자식 클래스의 생성자보다 먼저 실행되나 호출은 자식 클래스가 먼저 호출됨
※ 자식 클래스의 생성자에서 부모 클래스의 멤버 변수를 초기화 하게 되면 중복 발생
- 자식 클래스에서 부모 클래스의 어떤 생성자를 호출할 지 선택 가능
class CMyData
{
public:
CMyData()
{
cout << "CMyData()" << endl;
}
CMyData(int nParam)
{
cout << "CMyData(int)" << endl;
}
CMyData(double dParam)
{
cout << "CMyData(double)" << endl;
}
};
class CMyDataEx : public CMyData
{
public:
CMyDataEx() : CMyData()
{
cout << "CMyDataEx()" << endl;
}
CMyDataEx(int nParam) : CMyData(nParam)
{
cout << "CMyDataEx(int)" << endl;
}
CMyDataEx(double dParam) : CMyData(dParam)
{
cout << "CMyDataEx(double)" << endl;
}
};
- 생성자 상속
class CMyData
{
public:
CMyData()
{
cout << "CMyData()" << endl;
}
CMyData(int nParam)
{
cout << "CMyData(int)" << endl;
}
CMyData(double dParam)
{
cout << "CMyData(double)" << endl;
}
};
class CMyDataEx : public CMyData
{
public:
using CMyData::CMyData;
};
가상 함수
- 가상 함수는 미래를 호출하는 것 -> 현재 코드에서 미래에 재정의하는 것을 허용할 경우 사용
- 과거에 만든 코드에서 가상 함수를 호출하고 현재에 가상 함수를 재정의 한다면, 현재 코드가 과거 코드에 의해서 호출됨 -> called by framework
소멸자
A *pdata = new B;
- B가 A의 자식 클래스인 위와 같은 경우에, 인스턴스를 delete하면 참조 형식인 A의 소멸자가 호출됨
- 만약 B의 생성자에서 메모리를 할당하는 코드가 있다면, 메모리 누수가 발생
- 이를 방지하기 위해서 미래에 위와 같이 추상적으로 코드를 작성할 것으로 예상되면 A 클래스의 소멸자를 가상화 해야 함
- 소멸자를 가상화 하게 되면 delete할 때, 실 형식인 B의 소멸자가 호출
순수 가상 함수
- 선언은 있지만, 정의는 없는 가상 함수
- 파생 클래스들이 이를 반드시 정의해야 함
- 이를 바탕으로 다른 상호작용하는 클래스는 정해진 규격 정보를 얻는 것
'💻 Computer Science > C & C++' 카테고리의 다른 글
[C++] 템플릿 (1) | 2024.06.04 |
---|---|
[C++] 관계 (0) | 2024.06.04 |
[C++] 연산자 다중 정의 (0) | 2024.04.15 |
[C++] 생성자와 소멸자 (1) | 2024.02.05 |
[C++] 네임스페이스 (0) | 2024.02.05 |