#include "stdafx.h"
#include <iostream>
using namespace std;
#include "stdafx.h"
#include <iostream>
using namespace std;
// 부모
class CMyData
{
public:
CMyData() { cout << "부모 생성자 호출 " << endl; }
~CMyData() { cout << "부모 소멸자 호출 " << endl; }
int GetData() { return m_nData; }
void SetData(int nParam) { m_nData = nParam; }
protected:
void PrintData() { cout << "CMyData::PrintData()" << endl; }
private:
int m_nData = 0;
};
// 자식
class CMyDataEx : public CMyData
{
public:
CMyDataEx() { cout << "자식 생성자 호출 " << endl; }
~CMyDataEx() { cout << "자식 소멸자 호출 " << endl; }
void TestFunc()
{
PrintData();
SetData(5);
cout << CMyData::GetData() << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CMyDataEx data;
data.SetData(10);
cout << data.GetData() << endl;
data.TestFunc();
return 0;
}
소멸자는 반대이다. 자식 제거 -> 부모 제거
#include "stdafx.h"
#include <iostream>
using namespace std;
// 부모
class CMyData
{
public:
int GetData() { return m_nData; }
void SetData(int nParam) { m_nData = nParam; }
CMyData()
{
cout << "부모 생성자 호출" << endl;
}
~CMyData()
{
cout << "부모 소멸자 호출" << endl;
}
private:
int m_nData = 0;
};
// 자식
class CMyDataEx : public CMyData
{
public:
void SetData(int nParam)
{
if (nParam < 0)
CMyData::SetData(0);
if (nParam > 10)
CMyData::SetData(10);
}
CMyDataEx()
{
cout << "자식 생성자 호출" << endl;
}
~CMyDataEx()
{
cout << "자식 소멸자 호출" << endl;
}
void show_child()
{
cout << "child" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//추가
CMyData *tmp = new CMyDataEx(); // 상향 형변환
delete tmp;
return 0;
}
CMyData *tmp = new CMyDataEx();
tmp를 참조형식이라 하고 CMyDataEx 요놈을 실형식이라고 한다.
부모를 이용해 자식을 동적할당했으며 이를 상향형변환이라고 한다.
문제점으로는 자식쪽의 소멸자가 호출되지 않는다는 점이다.
-> 지금 이 코드는 문제가 없으나, 만약 자식과 부모 쪽에 생성자에서 포인터를 할당하고, 소멸자에서 할당해제하는 코드가 있다면,
자식쪽의 소멸자는 호출되지 않으므로 메모리 누수가 발생한다.
