상속

·2021년 3월 29일

이것이c++이다.

목록 보기
1/1

상속 관계에서의 호출

  • 코드
#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;
}

  • data.SetData(10);
    자식 생성자인 CMyDataEx가 호출되면서 부모 생성자가 호출되며, 부모 생성자의 실행 후에 자식 생성자가 실행된다.

소멸자는 반대이다. 자식 제거 -> 부모 제거

참조 형식과 실형식

  • 코드
#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;
}

알 수 있는 점 1. 소멸자 문제

CMyData *tmp = new CMyDataEx();

tmp를 참조형식이라 하고 CMyDataEx 요놈을 실형식이라고 한다.
부모를 이용해 자식을 동적할당했으며 이를 상향형변환이라고 한다.
문제점으로는 자식쪽의 소멸자가 호출되지 않는다는 점이다.

-> 지금 이 코드는 문제가 없으나, 만약 자식과 부모 쪽에 생성자에서 포인터를 할당하고, 소멸자에서 할당해제하는 코드가 있다면,
자식쪽의 소멸자는 호출되지 않으므로 메모리 누수가 발생한다.

=> 상향형변환은 자식의 소멸자를 호출하지 못한다.

알 수 있는 점 2. 상향형변환은 자식의 타입을 추론할 수 없다.

-> 하향형변환을 통해 자식쪽 객체의 함수에 접근해야 한다.

상향형변환할 경우 멍청하게 동작한다. 그에 따른 대비책을 갖춰야 한다.

profile
🔥🔥🔥

0개의 댓글