여기에서 다양한 유형의 다형성을 볼 수 있습니다. 유형은 -
- 임시
- 포함
- 파라메트릭
- 강압
Ad-Hoc 다형성을 오버로딩이라고 합니다. 이것은 같은 이름을 가진 함수가 다른 유형에 대해 다른 방식으로 작동하도록 합니다. 함수와 연산자는 모두 오버로드될 수 있습니다. 일부 언어는 연산자 오버로딩을 지원하지 않지만 함수 오버로딩은 일반적입니다.
예시
#include<iostream> using namespace std; int add(int a, int b) { return a + b; } string add(string a, string b) { return a + b; //concatenate } int main() { cout << "Addition of numbers: " << add(2, 7) << endl; cout << "Addition of Strings: " << add("hello", "World") << endl; }
출력
Addition of numbers: 9 Addition of Strings: helloWorld
포함 다형성을 하위 유형 지정이라고 합니다. 이를 통해 기본 클래스 포인터와 참조를 사용하여 파생 클래스를 가리킬 수 있습니다. 이것은 런타임 다형성입니다. 우리는 그것이 실행될 때까지 실제 객체의 유형을 모릅니다. 이 포함 다형성을 달성하려면 C++의 가상 함수가 필요합니다.
예시
#include<iostream> using namespace std; class Base { public: virtual void print() { cout << "This is base class." << endl; } }; class Derived : public Base { public: void print() { cout << "This is derived class." << endl; } }; int main() { Base *ob1; Base base_obj; Derived derived_obj; ob1 = &base_obj; //object of base class ob1->print(); ob1 = &derived_obj; //same pointer to point derived object ob1->print(); }
출력
This is base class. This is derived class.
강제 다형성을 캐스팅(casting)이라고 합니다. 이러한 유형의 다형성은 객체 또는 기본 요소가 다른 유형으로 캐스팅될 때 발생합니다. 캐스팅에는 두 가지 유형이 있습니다. 암시적 캐스팅은 컴파일러 자체를 사용하여 수행되고 명시적 캐스팅은 const_cast, dynamic_cast 등을 사용하여 수행됩니다.
예시
#include<iostream> using namespace std; class Integer { int val; public: Integer(int x) : val(x) { } operator int() const { return val; } }; void display(int x) { cout << "Value is: " << x << endl; } int main() { Integer x = 50; display(100); display(x); }
출력
Value is: 100 Value is: 50
파라메트릭 다형성을 Early Binding이라고 합니다. 이 유형의 다형성을 사용하면 다른 유형에 대해 동일한 코드를 사용할 수 있습니다. 템플릿을 사용하여 얻을 수 있습니다.
예시
#include<iostream> using namespace std; template <class T> T maximum(T a, T b) { if(a > b) { return a; } else { return b; } } int main() { cout << "Max of (156, 78): " << maximum(156, 78) << endl; cout << "Max of (A, X): " << maximum('A', 'X') << endl; }
출력
Max of (156, 78): 156 Max of (A, X): X