다형성이라는 단어는 다양한 형태를 갖는다는 것을 의미합니다. 간단히 말해서, 다형성을 메시지가 두 가지 이상의 형식으로 표시되는 능력으로 정의할 수 있습니다. 다형성의 실제 예는 동시에 다른 특성을 가질 수 있는 사람입니다. 남자는 동시에 아버지이자 남편이자 직원이다. 그래서 같은 사람이라도 상황에 따라 다른 행동을 보입니다. 이것을 다형성이라고 합니다. 다형성은 객체지향 프로그래밍의 중요한 특징 중 하나로 간주됩니다.
다형성의 유형
- 컴파일 타임 다형성
- 런타임 다형성

다형성의 유형
1. 컴파일 타임 다형성
이러한 유형의 다형성은 함수 오버로딩 또는 연산자 오버로딩을 통해 달성됩니다.
A. 함수 오버로딩
이름은 같지만 매개변수가 다른 함수가 여러 개 있는 경우 해당 함수를 다음과 같다고 합니다. 과부하, 따라서 이를 함수 오버로딩이라고 합니다. 함수는 다음에 의해 오버로드될 수 있습니다. 인수 수 변경 또는/그리고 인수 유형 변경 . 간단히 말해서, 하나의 함수 이름 아래에 수많은 작업이 나열될 때 이름은 같지만 매개변수가 다른 여러 함수를 제공하는 객체지향 프로그래밍의 특징입니다. 함수를 오버로딩하는 동안 따라야 하는 특정 함수 오버로딩 규칙이 있습니다.
다음은 함수 오버로딩 또는 컴파일 타임 다형성을 보여주는 C++ 프로그램입니다.
C++
// C++ program to demonstrate> // function overloading or> // Compile-time Polymorphism> #include> using> namespace> std;> class> Geeks {> public> :> > // Function with 1 int parameter> > void> func(> int> x)> > {> > cout <<> 'value of x is '> << x << endl;> > }> > // Function with same name but> > // 1 double parameter> > void> func(> double> x)> > {> > cout <<> 'value of x is '> << x << endl;> > }> > // Function with same name and> > // 2 int parameters> > void> func(> int> x,> int> y)> > {> > cout <<> 'value of x and y is '> << x <<> ', '> << y> > << endl;> > }> };> // Driver code> int> main()> {> > Geeks obj1;> > // Function being called depends> > // on the parameters passed> > // func() is called with int value> > obj1.func(7);> > // func() is called with double value> > obj1.func(9.132);> > // func() is called with 2 int values> > obj1.func(85, 64);> > return> 0;> }> |
>
쉘 정렬
>산출
value of x is 7 value of x is 9.132 value of x and y is 85, 64>
설명: 위의 예에서 function이라는 단일 함수는 기능() 다형성의 속성인 세 가지 다른 상황에서 다르게 작동합니다. 이에 대해 더 자세히 알고 싶다면 다음 기사를 참조하세요. C++의 함수 오버로딩 .
B. 연산자 오버로딩
C++에는 연산자에 데이터 유형에 대한 특별한 의미를 제공하는 기능이 있으며, 이 기능을 연산자 오버로딩이라고 합니다. 예를 들어 문자열 클래스에 더하기 연산자(+)를 사용하여 두 문자열을 연결할 수 있습니다. 우리는 이 연산자의 임무가 두 개의 피연산자를 추가하는 것임을 알고 있습니다. 따라서 단일 연산자 '+'는 정수 피연산자 사이에 배치되면 이를 추가하고 문자열 피연산자 사이에 배치되면 이들을 연결합니다.
다음은 연산자 오버로딩을 보여주는 C++ 프로그램입니다.
CPP
자바 문자를 int로
// C++ program to demonstrate> // Operator Overloading or> // Compile-Time Polymorphism> #include> using> namespace> std;> class> Complex {> private> :> > int> real, imag;> public> :> > Complex(> int> r = 0,> int> i = 0)> > {> > real = r;> > imag = i;> > }> > // This is automatically called> > // when '+' is used with between> > // two Complex objects> > Complex operator+(Complex> const> & obj)> > {> > Complex res;> > res.real = real + obj.real;> > res.imag = imag + obj.imag;> > return> res;> > }> > void> print() { cout << real <<> ' + i'> << imag << endl; }> };> // Driver code> int> main()> {> > Complex c1(10, 5), c2(2, 4);> > // An example call to 'operator+'> > Complex c3 = c1 + c2;> > c3.print();> }> |
>
>산출
12 + i9>
설명: 위의 예에서는 '+' 연산자가 오버로드되었습니다. 일반적으로 이 연산자는 두 개의 숫자(정수 또는 부동 소수점 수)를 더하는 데 사용되지만 여기서는 두 개의 허수 또는 복소수를 더하는 데 사용됩니다. 이에 대한 자세한 내용은 다음 기사를 참조하세요. 연산자 오버로딩 .
2. 런타임 다형성
이러한 유형의 다형성은 다음과 같이 달성됩니다. 함수 재정의 . 후기 바인딩과 동적 다형성은 런타임 다형성의 다른 이름입니다. 함수 호출은 런타임에 해결됩니다. 런타임 다형성 . 이와 대조적으로, 컴파일 시간 다형성을 사용하면 컴파일러는 런타임에 개체를 추론한 후 개체에 바인딩할 함수 호출을 결정합니다.
A. 함수 재정의
함수 재정의 파생 클래스에 기본 클래스의 멤버 함수 중 하나에 대한 정의가 있을 때 발생합니다. 해당 기본 기능은 재정의되었다고 합니다.

기능 재정의 설명
데이터 멤버를 사용한 런타임 다형성
C++의 데이터 멤버로는 런타임 다형성을 달성할 수 없습니다. 파생 클래스의 인스턴스를 참조하는 상위 클래스의 참조 변수로 필드에 액세스하는 예를 살펴보겠습니다.
C++
데이터베이스의 정규화
// C++ program for function overriding with data members> #include> using> namespace> std;> // base class declaration.> class> Animal {> public> :> > string color => 'Black'> ;> };> // inheriting Animal class.> class> Dog :> public> Animal {> public> :> > string color => 'Grey'> ;> };> // Driver code> int> main(> void> )> {> > Animal d = Dog();> // accessing the field by reference> > // variable which refers to derived> > cout << d.color;> }> |
>
>산출
Black>
부모 클래스 참조는 항상 부모 클래스의 데이터 멤버를 참조한다는 것을 알 수 있습니다.
B. 가상 기능
ㅏ 가상 기능 virtual 키워드를 사용하여 기본 클래스에서 선언되고 파생 클래스에서 다시 정의(재정의)되는 멤버 함수입니다.
가상 기능에 대한 몇 가지 핵심 사항:
- 가상 기능은 본질적으로 동적입니다.
- 키워드를 삽입하여 정의됩니다. 가상 기본 클래스 내부에 있으며 항상 기본 클래스로 선언되고 하위 클래스에서 재정의됩니다.
- 런타임 중에 가상 함수가 호출됩니다.
다음은 가상 기능을 시연하는 C++ 프로그램입니다.
C++
맥 운영 체제
// C++ Program to demonstrate> // the Virtual Function> #include> using> namespace> std;> // Declaring a Base class> class> GFG_Base {> public> :> > // virtual function> > virtual> void> display()> > {> > cout <<> 'Called virtual Base Class function'> > <<> '
'> ;> > }> > void> print()> > {> > cout <<> 'Called GFG_Base print function'> > <<> '
'> ;> > }> };> // Declaring a Child Class> class> GFG_Child :> public> GFG_Base {> public> :> > void> display()> > {> > cout <<> 'Called GFG_Child Display Function'> > <<> '
'> ;> > }> > void> print()> > {> > cout <<> 'Called GFG_Child print Function'> > <<> '
'> ;> > }> };> // Driver code> int> main()> {> > // Create a reference of class GFG_Base> > GFG_Base* base;> > GFG_Child child;> > base = &child;> > // This will call the virtual function> > base->GFG_Base::디스플레이();> > // this will call the non-virtual function> > base->인쇄();> }> |
>
>산출
Called virtual Base Class function Called GFG_Base print function>
예 2:
C++
데이터 베이스
// C++ program for virtual function overriding> #include> using> namespace> std;> class> base {> public> :> > virtual> void> print()> > {> > cout <<> 'print base class'> << endl;> > }> > void> show() { cout <<> 'show base class'> << endl; }> };> class> derived :> public> base {> public> :> > // print () is already virtual function in> > // derived class, we could also declared as> > // virtual void print () explicitly> > void> print() { cout <<> 'print derived class'> << endl; }> > void> show() { cout <<> 'show derived class'> << endl; }> };> // Driver code> int> main()> {> > base* bptr;> > derived d;> > bptr = &d;> > // Virtual function, binded at> > // runtime (Runtime polymorphism)> > bptr->인쇄();> > // Non-virtual function, binded> > // at compile time> > bptr->쇼();> > return> 0;> }> |
>
>산출
print derived class show base class>