Best answer
실제로 C에는 다형성의 개념이 없습니다. 다형성은 객체 지향 프로그래밍의 속성입니다. C는 OOP가 아니기 때문에 C에는 다형성의 개념이 없습니다. C ++는 객체 지향 프로그래밍 언어이기 때문에 (완전하지는 않습니다)
다형성은 다양한 형태를 갖는 것을 의미합니다. C ++에는 주로 두 가지 유형의 다형성이 있습니다.
- 컴파일 시간 다형성
- 런타임 다형성
- 컴파일 시간 다형성 : 이러한 유형의 다형성은 함수 오버로딩 또는 연산자 오버로딩에 의해 달성됩니다.
- 함수 오버로딩 : 이름은 같지만 매개 변수가 다른 여러 함수가있는 경우 이러한 함수는 오버로드 라고합니다. 함수는 인수 수 변경 또는 / 및 인수 유형 변경 에 의해 오버로드 될 수 있습니다. .
#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;
}
};
int main() {
Geeks obj1;
// The first "func" is called
obj1.func(7);
// The second "func" is called
obj1.func(9.132);
// The third "func" is called
obj1.func(85,64);
return 0;
}
- 연산자 과부하 : C ++는 또한 연산자를 과부하하는 옵션을 제공합니다. 예를 들어, 문자열 클래스에 대한 연산자 (‘+’)를 만들어 두 문자열을 연결할 수 있습니다. 이것이 피연산자에 추가하는 작업을 수행하는 더하기 연산자라는 것을 알고 있습니다. 따라서 단일 연산자 +는 정수 피연산자 사이에 배치 될 때 추가하고 문자열 피연산자 사이에 배치 될 때 연결합니다.
#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; }
};
int main()
{
Complex c1(10, 5), c2(2, 4);
Complex c3 = c1 + c2; // An example call to "operator+"
c3.print();
}
2. 런타임 다형성 : :이 유형의 다형성은 함수 재정의에 의해 달성됩니다.
- 함수 재정의 : 반면에 파생 클래스에 기본 클래스의 멤버 함수 중 하나에 대한 정의가있을 때 발생합니다. 그 기본 함수는 재정의되었다고합니다.
#include
using namespace std;
// Base class
class Parent
{
public:
void print()
{
cout << "The Parent print function was called" << endl;
}
};
// Derived class
class Child : public Parent
{
public:
// definition of a member function already present in Parent
void print()
{
cout << "The child print function was called" << endl;
}
};
//main function
int main()
{
//object of parent class
Parent obj1;
//object of child class
Child obj2 = Child();
// obj1 will call the print function in Parent
obj1.print();
// obj2 will override the print function in Parent
// and call the print function in Child
obj2.print();
return 0;
}
답변
이것이 다형성의 정의이기 때문에 : 코드는 그렇지 않습니다. 어떤 객체의 실제 클래스가 무엇인지 런타임까지 알 수 있습니다.
전통적인 예제를 사용하여 draw () 메서드가있는 기본 클래스 Shape를 고려해 보겠습니다. Shape에는 두 개의 하위 클래스가 있습니다. 둘 다 draw ()를 재정의하는 Circle과 Square는 각각 원과 사각형을 그립니다.
이제 응용 프로그램에서 사용자가 여러 모양을 만들 수 있습니다. 그리고 뷰 업데이트 함수는 그것들을 반복하고 호출합니다 :
currentShape.draw ()
컴파일러는 컴파일 타임에 currentShape가 Square인지 Circle인지 알 방법이 없습니다. 따라서 호출 할 draw () 구현. 결정은 런타임에 이루어져야합니다.
허용되며, 컴파일러가 객체의 실제 클래스를 * 추론 할 수있는 * 경우가 있습니다. 이 경우 런타임 조회를 최적화 할 수 있습니다.
다형성과이 런타임은 함수 중 하나 (또는 그 이상)의 실제 데이터 유형에 따라 함수의 올바른 구현으로 발송됩니다. 논쟁은 매우 유용하고 강력합니다.