All Development

C++) 가상 함수

Todah 2024. 4. 3. 22:30
반응형

1. 가상 함수

virtual 반환형식 메서드명;

 

- virtual 예약어를 붙여 선언한 메서드다.

- 기본적으로 자기부정을 전제로 작동한다.

- 파생 클래스에서 기본 클래스의 가상 함수 재정의 시 기본 클래스 메서드는 완전히 무시(Override) 되는 것이 특징이다.

- 참조형식이 기본 클래스라고 하더라도 파생 클래스 메서드가 호출된다. (매우 중요한부분)

 

 

* 개인적인 생각 : 가상 함수가 등장하게된 배경에는 현재의 설계자가 미래의 사용자들을 위한 안배라고 볼 수 있을 것 같다. 미래의 사용자가 현재의 함수들을 더 효율적이고, 더 빠르고, 더 생산적인 함수로 재정의 할 수 있도록 해주는 것이 바로 가상 함수라고 생각한다.

 

#include <iostream>
using namespace std;

class CMyData
{
public:
	//가상 함수로 선언 및 정의
	virtual void PrintData() {
		cout << "CMyData: " << m_nData << endl;
	}

	void TestFunc() {
		cout << "***TestFunc()***" << endl;
		//실 형식의 함수가 호출
		PrintData();
		cout << "****************" << endl;
	}

protected:
	int m_nData = 10;
};

class CMyDataEx : public CMyData
{
public:
	//기본 클래스의 가상 함수 멤버를 재정의
	//따라서 기존 정의는 무시
	virtual void PrintData() {
		cout << "CMyDataEx: " << m_nData * 2 << endl;
	}
};

int main()
{
	CMyDataEx a;
	a.PrintData();

	CMyData& b = a;

	//참조 형식에 상관없이 실형식의 함수가 호출
	b.PrintData();
	//마지막에 재정의된 함수가 호출
	a.TestFunc();

	return 0;
}

 

2. 소멸자 가상화

MyData *pData = new MyDataEx;
delete pdata;

 

- 상위 기본 클래스로 하위 파생 클래스를 참조할 때 상위 기본 클래스는 추상 자료형(Abstraction Data Type)이다.

- 추상형에 대한 delete 연산 시 파생 형식 소멸자가 호출되려면 반드시 소멸자를 가상화 해야한다.

 

* 개인적인 생각 : 당연한 말이다. 기본 클래스의 생성자와 파생 클래스의 생성자가 모두 호출되는 시점에서 소멸자가 가상화되지 않은 상태로 추상 자료형에 대한 delete 연산을 사용할 경우, 파생 클래스에 할당된 메모리는 그대로 남아있고 기본 클래스에 할당된 메모리만 해제되는 현상이 발생할 것이다.

 

#include <iostream>
using namespace std;

class CMyData
{
public:
	CMyData() { m_pszData = new char[32]; }
	~CMyData()
	{
		cout << "~CMyData()" << endl;
		delete m_pszData;
	}

private:
	char* m_pszData;
};

class CMyDataEx : public CMyData
{
public:
	CMyDataEx() { m_pnData = new int; }
	~CMyDataEx()
	{
		cout << "~CMyDataEx()" << endl;
		delete m_pnData;
	}

private:
	int* m_pnData;
};

int main()
{
	CMyData* pData = new CMyDataEx;
	//참조 형식에 맞는 소멸자가 호출
	delete pData;
}

 

반응형

'All Development' 카테고리의 다른 글

C++) 순수 가상 클래스  (0) 2024.04.17
C++) 가상 함수 작동원리  (0) 2024.04.15
C++) 상속의 생정자와 소멸자  (3) 2024.03.29
C++) 메서드 재정의  (0) 2024.03.27
C++) 상속  (1) 2024.03.22