다형성의 사전적 의미

프로그램 언어의 다형성은 자료형 체계의 성질을 나타낸다.
언어의 각 요소들(상수, 변수, 식, 오브젝트, 메소드 등등) 다양한 자료형에 속하는 것이 허가되는 성질이다.
원래는 생물학에서 유래된 단어라고 하는데, 동일한 종에 속하는 생물이라 할지라도 다양한 변이를 가지는 형상이라고한다.
영어 단어인 Polymorphis은 여러개를 의미하는 그리스어 'Poly'와 모습, 모양을 뜻하는 그리스어 'Morphism'에서 온 단어로 '여러가지 형태'라는 의미이다.

C++ 언어에서의 다형성

가상 함수
부모 클래스와 자식 클래스에 동일한 이름의 함수의 다른 작동 

함수 템플릿
동일한 이름의 함수가 다양한 자료형을 처리

함수 오버로드
동일한 이름의 함수가 다른 작동

연산자 오버로드
한가지 연산자가 다양한 작동

함수 이름이 같아도 다른 작업을 하는것을 말한다.

코드

#include <iostream>

class A
{
public:
	virtual void Func()
	{
		std::cout << "A함수" << std::endl << std::endl;
	}
	A()
	{
		std::cout << "A생성" << std::endl << std::endl;
	}
	~A()
	{
		std::cout << "A소멸" << std::endl << std::endl;
	}
};

class B : public A
{
public:
	void Func() override
	{
		std::cout << "B함수" << std::endl << std::endl;
	}
	B()
	{
		std::cout << "B생성" << std::endl << std::endl;
	}
	~B()
	{
		std::cout << "B소멸" << std::endl << std::endl;
	}
};

int main()
{
	A a;
	a.Func();

	B b;
	b.Func();
	return 0;
}

같은 이름의 Func() 함수를 호출했지만
A 함수
B 함수
로 출력되고있다.

#include <iostream>

class A
{
public:
	template <typename T>
	void Func(T _value)
	{
		std::cout << sizeof(T) << std::endl << std::endl;
	}

	A()
	{
		std::cout << "A생성" << std::endl << std::endl;
	}
	~A()
	{
		std::cout << "A소멸" << std::endl << std::endl;
	}
};



int main()
{
	char _c = '0';
	short _s = 0 ;
	int _i = 0 ;
	__int64 _i64= 0;

	A a;
	a.Func(_c);
	a.Func(_s);
	a.Func(_i);
	a.Func(_i64);

	return 0;
}

같은 이름의 Func() 함수를 호출했지만 매개변수로 여러 타입을 받아왔다.

#include <iostream>

class A
{
public:
	void Func()
	{
		std::cout << "A일반 함수" << std::endl << std::endl;
	}

	void Func(char _c)
	{
		std::cout << "A일반 캐릭터" << std::endl << std::endl;
	}

	void Func(short _s)
	{
		std::cout << "A일반 쇼트" << std::endl << std::endl;
	}

	void Func(int _i)
	{
		std::cout << "A일반 인트" << std::endl << std::endl;
	}

	void Func(__int64 _i64)
	{
		std::cout << "A일반 인트64" << std::endl << std::endl;
	}

	A()
	{
		std::cout << "A생성" << std::endl << std::endl;
	}
	~A()
	{
		std::cout << "A소멸" << std::endl << std::endl;
	}
};



int main()
{
	char _c = '0';
	short _s = 0 ;
	int _i = 0 ;
	__int64 _i64= 0;

	A a;
	a.Func();
	a.Func(_c);
	a.Func(_s);
	a.Func(_i);
	a.Func(_i64);

	return 0;
}

같은 이름의 Func() 함수를 호출했지만
매개변수에 타입에 따라 다른 함수가 호출된다.

#include <iostream>

class A
{
public:
	bool operator==(A& _A)
	{
		std::cout << "매개변수 A비교" << std::endl << std::endl;
		return true;
	}
	bool operator==(int _Value)
	{
		std::cout << "매개변수 int" << std::endl << std::endl;
		return true;
	}

	A()
	{
		std::cout << "A생성" << std::endl << std::endl;
	}
	~A()
	{
		std::cout << "A소멸" << std::endl << std::endl;
	}
};



int main()
{
	int _i = 0 ;

	A a;

	A aa;

	bool Result;
	Result = (a == aa);
	Result = (a == _i);

	return 0;
}

같은 == 연산자를 사용했지만
하나는 A클래스를 받고 다른 하나는 int형을 비교했다.
좀 억지스럽게 보여주려고 만든 코드이니 어떻게 작동하는지만 봐주세요.

+ Recent posts