C 언어
다형성이라는 단어 형태가 많다는 뜻입니다. 일반적으로 다형성은 클래스의 계층 구조가 있고 상속으로 관련되어 있을 때 발생합니다.
C++ 다형성은 멤버 함수를 호출하면 해당 함수를 호출하는 개체의 유형에 따라 다른 함수가 실행된다는 의미입니다.
기본 클래스가 다른 두 클래스에 의해 파생된 다음 예를 고려하십시오. -
라이브 데모#include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0){ width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape { public: Rectangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape { public: Triangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; return (width * height / 2); } }; // Main function for the program int main() { Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // store the address of Rectangle shape = &rec; // call rectangle area. shape->area(); // store the address of Triangle shape = &tri; // call triangle area. shape->area(); return 0; }
위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -
Parent class area : Parent class area :
잘못된 출력의 이유는 함수 area()의 호출이 기본 클래스에 정의된 버전으로 컴파일러에 의해 한 번 설정되기 때문입니다. 이것을 정적 해상도라고 합니다. 함수 호출 또는 정적 연결 - 함수 호출은 프로그램이 실행되기 전에 고정됩니다. 이를 조기 바인딩이라고도 합니다. 프로그램을 컴파일하는 동안 area() 함수가 설정되기 때문입니다.
그러나 이제 프로그램을 약간 수정하고 virtual 키워드를 사용하여 Shape 클래스의 area() 선언 앞에 둡시다. 이렇게 보이도록 -
class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0) { width = a; height = b; } virtual int area() { cout << "Parent class area :" <<endl; return 0; } };
이 약간의 수정 후에 이전 예제 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -
Rectangle class area Triangle class area
이번에는 컴파일러가 형식 대신 포인터의 내용을 확인합니다. 따라서 tri 및 rec 클래스의 객체 주소는 *모양으로 저장되기 때문에 해당 area() 함수가 호출됩니다.
보시다시피 각 자식 클래스에는 area() 함수에 대한 별도의 구현이 있습니다. 이것이 다형성입니다. 일반적으로 사용됩니다. 같은 이름의 함수를 가진 다른 클래스가 있고 매개변수도 같지만 구현은 다릅니다.
가상 function은 virtual 키워드를 사용하여 선언된 기본 클래스의 함수입니다. . 파생 클래스의 다른 버전과 함께 기본 클래스에서 가상 함수를 정의하면 컴파일러에 이 함수에 대한 정적 연결을 원하지 않는다는 신호를 보냅니다.
우리가 원하는 것은 호출되는 객체의 종류를 기반으로 프로그램의 주어진 지점에서 호출될 함수를 선택하는 것입니다. 이러한 종류의 작업을 동적 연결이라고 합니다. , 또는 지연 바인딩 .
가상 함수를 기본 클래스에 포함하여 해당 클래스의 개체에 맞게 파생 클래스에서 재정의할 수 있지만 기본 클래스의 함수에 대해 제공할 수 있는 의미 있는 정의가 없을 수 있습니다. .
기본 클래스의 가상 함수 area()를 다음과 같이 변경할 수 있습니다. -
class Shape { protected: int width, height; public: Shape(int a = 0, int b = 0) { width = a; height = b; } // pure virtual function virtual int area() = 0; };
=0은 컴파일러에게 함수에 본문이 없고 위의 가상 함수를 순수 가상 함수라고 합니다. .
C 언어
1) C++에서 클래스가 무엇인지 설명하세요. C++에서 클래스는 하나의 이름으로 함수 및 관련 데이터의 모음으로 정의할 수 있습니다. 그것은 개체의 청사진입니다. C++ 프로그램은 여러 클래스로 구성될 수 있습니다. 2) C++에서 클래스를 지정하는 방법은 무엇입니까? class 키워드 뒤에 식별자(클래스 이름)를 사용하여 C++에서 클래스를 지정할 수 있습니다. 중괄호 안에 클래스의 본문이 정의됩니다. 마지막에 세미콜론으로 끝납니다. For example, class name{ // some data // some fu
C#에서 상속이란 무엇입니까? 상속 C#의 중요한 개념입니다. 상속은 부모 클래스와 자식 클래스를 정의하는 개념입니다. 자식 클래스는 부모 클래스의 메서드와 속성을 상속하지만 동시에 필요한 경우 메서드의 동작을 수정할 수도 있습니다. 자식 클래스는 필요한 경우 자체 메서드를 정의할 수도 있습니다. 이 C# 자습서에서는 다음을 배우게 됩니다. C#에서 상속이란 무엇입니까? C# 상속 예 C#의 다형성이란 무엇입니까? C# 다형성 예제 프로그램 예제를 통해 C# 상속에 대해 더 잘 이해해 보겠습니다. C# 상속 예제 이제 코