'상속 받는 기본 매개변수'에 해당되는 글 1건

  1. 2009.07.29 상속 받는 기본 매개변수 값 변경 금지!
[ Programming ]2009. 7. 29. 15:41
C++에서 함수의 상속은 2가지로 말 할수 있다.
가상 함수와 비 가상 함수이다.
비 가상 함수는 파생 클래스에서 재 정의 하면 안되므로... 넘기고 나면,  가상 함수에 해당 하는 내용이란 걸 알수 있습니다.

상속 받은 가상 함수에서 기본 매개 변수의 값을 변경 하면 안되는 이유는, 동적 바인딩과 정적 바인딩을 알아 보면 된다.
가상 함수는 동적 바인딩이고 기본 매개 변수 값은 정적 바인딩 입니다.

// t.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"


class CBase
{
public:
	virtual void Show(const int _iIndex = 0)
	{
		std::cout << "CBase : " << _iIndex << std::endl;
	}
};

class CTest : public CBase
{
public:
	void Show(const int _iIndex = 1)
	{
		std::cout << "CTest : " << _iIndex << std::endl;
	}
};

class CTest2 : public CBase
{
public:
	void Show(const int _iIndex = 2)
	{
		std::cout << "CTest2 : " << _iIndex << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	/*
		t_pBase, t_pTest, t_pTest2는 CBaes에 대한 포인터로 선언 되어 있으므로
		정적 타입은 모두 CBase에 대한 포인터임. 가르키는 것에 대한 변화는 없음.

		객체의 동적 타입은 현재 그 객체가 가르키는 것에 의해 결정. 
		즉, t_pTest의 동적 타입은 CTest*고, t_pTest2의 동적 타입은 CTest2* 이다.
		동적 타입은 도중에 변경이 가능.
		ex) t_pTest = t_pTest2
		
		위에서 말 했듯이 가상함수는 동적타입이고 상속 받는 기본 매개변수들은
		정적 타입입니다. 즉, 실행 되는 함수 실행 내용은 알맞은 내용을 수행 하지만,
		그 가상 함수에 대한 개본 매개변수는 정적 타입에 대한것을 불러서 이상한 결과를
		초래 하게 된다.
	*/
	CBase* t_pBase;
	CBase* t_pTest = new CTest;
	CBase* t_pTest2 = new CTest2;

	/// CTest::Show(const int _iIndex = 1)을 호출 하지만, 기본 매개변수는 0을 호출.
	t_pBase = t_pTest;
	t_pBase->Show();

	/// CTest2::Show(const int _iIndex = 2)을 호출 하지만, 기본 매개변수는 0을 호출.
	t_pBase = t_pTest2;
	t_pBase->Show();

	return 0;
}

/*
/// 비가상 인터페이스(non-virtual interface)관용구(NVI)를 이용한 눈속임?
class CBase
{
public:
	void Show(const int _iIndex = 0)
	{
		doShow(_iIndex);
	}
private:
	virtual doShow(const int _iIndex) = 0;
};
*/
Posted by 냉동