C에서 다형성은 무엇을 의미합니까?


Best answer

실제로 C에는 다형성의 개념이 없습니다. 다형성은 객체 지향 프로그래밍의 속성입니다. C는 OOP가 아니기 때문에 C에는 다형성의 개념이 없습니다. C ++는 객체 지향 프로그래밍 언어이기 때문에 (완전하지는 않습니다)

다형성은 다양한 형태를 갖는 것을 의미합니다. C ++에는 주로 두 가지 유형의 다형성이 있습니다.

  • 컴파일 시간 다형성
  • 런타임 다형성
    1. 컴파일 시간 다형성 : 이러한 유형의 다형성은 함수 오버로딩 또는 연산자 오버로딩에 의해 달성됩니다.
  • 함수 오버로딩 : 이름은 같지만 매개 변수가 다른 여러 함수가있는 경우 이러한 함수는 오버로드 라고합니다. 함수는 인수 수 변경 또는 / 및 인수 유형 변경 에 의해 오버로드 될 수 있습니다. .

#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 () 구현. 결정은 런타임에 이루어져야합니다.

허용되며, 컴파일러가 객체의 실제 클래스를 * 추론 할 수있는 * 경우가 있습니다. 이 경우 런타임 조회를 최적화 할 수 있습니다.

다형성과이 런타임은 함수 중 하나 (또는 ​​그 이상)의 실제 데이터 유형에 따라 함수의 올바른 구현으로 발송됩니다. 논쟁은 매우 유용하고 강력합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다