logo

C++ 다형성

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

다형성의 유형

  • 컴파일 타임 다형성
  • 런타임 다형성
다형성의 유형

다형성의 유형



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++




데이터베이스의 정규화

// 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>