C ++에서 가상 기능을 구현하는 방법?



이 기사에서는 C ++의 가상 기능이라는 또 다른 프로그래밍 개념을 소개합니다. 이 개념은 데모를 통해 지원됩니다.

가상 기능 C ++ 파생 클래스에서 재정의하는 기본 클래스 내의 멤버 함수입니다. 이 기사는 개념을 자세히 탐색하는 데 도움이됩니다. 이 기사에서는 다음과 같은 포인터를 다룰 것입니다.

이제 C ++의 가상 함수에 대한이 기사를 시작하겠습니다.





가상 기능이란?

가상 함수는 파생 클래스에서 재정의하는 기본 클래스 내의 멤버 함수입니다. virtual 키워드를 사용하여 선언됩니다. 가상 함수를 포함하는 클래스가 상속되면 파생 된 클래스는 자신의 필요에 맞게 가상 함수를 재정의합니다.

C ++의 가상 기능에 대한이 기사로 이동



C ++의 가상 기능 규칙 :

  • 이들은 항상 기본 클래스에서 정의되고 파생 클래스에서 재정의되지만 파생 클래스에서 재정의하는 것이 필수는 아닙니다.
  • 가상 함수는 클래스의 공용 섹션에서 선언되어야합니다.
  • 그들은 정적 일 수 없거나 친구 함수는 다른 클래스의 가상 함수가 될 수 없습니다.
  • 런타임 다형성을 달성하려면 포인터를 사용하여 가상 함수에 액세스해야합니다.

C ++의 가상 기능에 대한이 기사를 계속 진행합니다.

바인딩이란 무엇입니까?

함수 바인딩은 함수 호출이있을 때마다 컴파일러가 일치해야하는 함수 정의를 알아야 함을 의미합니다. 이것은 각 함수 선언의 서명 및 취해진 할당에 따라 다릅니다. 또한 컴파일러는 함수 호출과 올바른 정의 선택간에 이러한 일치가 발생하는시기를 알아야합니다.

C ++의 가상 기능에 대한이 기사로 이동



초기 바인딩

조기 바인딩은 다양한 함수 호출을 일치시키는 결정이 컴파일 시간 자체에 발생하고 컴파일러가 링크를 주소와 직접 연결하는 현상입니다. 정적 바인딩 또는 컴파일 타임 바인딩이라고도합니다.

  • 우리가 알고 있듯이 우리는 고급 언어로 코드를 작성합니다.
  • 그런 다음 컴파일러는 이것을 컴퓨터가 이해할 수있는 저수준 언어 (대부분 컴파일 시점의 기계 언어)로 변환합니다.
  • 초기 바인딩에서 컴파일러는 함수 선언 명령어의 주소를 함수 호출 명령어에 직접 제공합니다.
  • 따라서 이름에서 알 수 있듯이 바인딩은 프로그램이 실행되기 전에 매우 일찍 발생합니다.

#include using namespace std class Animals {public : void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // 초기 바인딩 반환 0}

산출

출력-C ++의 가상 기능-Edureka

설명 이온
이 예제에서는 부모 클래스 Animals에 대한 포인터 a를 만들었습니다. 그런 다음 a = & c를 작성하면 포인터‘a’가 Cats 클래스의 객체 c를 참조하기 시작했습니다.
a-> sound () – 포인터 'a'에 의해 두 클래스 모두에 존재하는 sound () 함수를 호출하면 포인터가 Cats 클래스의 객체를 참조하더라도 부모 클래스의 함수가 호출됩니다. .

범위 확인 연산자 C ++

이는 조기 바인딩 때문입니다. 'a'는 자식 클래스의 객체를 참조하는 부모 클래스의 포인터라는 것을 알고 있습니다. 초기 바인딩은 컴파일 타임에 발생하므로 컴파일러가 'a'가 부모 클래스의 포인터임을 알았을 때 포인터 개체를 검색하지 않고 부모 클래스의 'sound ()'함수와 호출을 일치시킵니다. 참조하고 있습니다.

C ++의 가상 기능에 대한이 기사로 이동

늦은 바인딩

후기 바인딩에서 컴파일러는 런타임에 개체를 식별 한 다음 함수 호출을 올바른 함수와 일치시킵니다. 동적 바인딩 또는 런타임 바인딩이라고도합니다.

위의 문제에서 Late binding은 기본 클래스에서 virtual 키워드를 사용하여 해결할 수 있습니다. 위의 예 자체를 사용하고 가상 키워드 만 추가하면 어떻게되는지 살펴 보겠습니다.

자바에서 객체 배열을 선언하는 방법
#include using namespace std class Animals {public : virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () 반환 0}

산출

설명
여기서 기본 클래스의 sound () 함수는 가상으로 만들어 졌으므로 컴파일러는 이제이 함수에 대해 후기 바인딩을 수행합니다. 이제 sound () 함수의 함수 호출이 런타임에 함수 정의와 일치합니다. 컴파일러는 이제 파생 클래스 Cats의 객체 'c'를 참조하는 포인터 'a'를 식별하므로 Cats 클래스의 sound () 함수를 호출합니다.

C ++의 가상 기능에 대한이 기사로 이동

순수 가상 기능

C ++의 순수 가상 함수는 우리가 구현하지 않고 선언 만하는 가상 함수입니다. 순수 가상 함수는 선언에 0을 할당하여 선언됩니다.

가상 무효 사운드 () = 0

여기서 sound ()는 순수한 가상 기능입니다.

C ++의 가상 기능에 대한이 기사로 이동

추상 클래스

추상 클래스는 하나 이상의 순수 가상 함수가있는 클래스로 정의됩니다. 위에서 설명한 것처럼 순수 가상 기능은 구현이없는 것으로 표시된 가상 멤버 기능입니다. 기본 클래스를 포함하여 클래스에 제공된 정보로는 구현할 수 없습니다. 추상 클래스는 추상 기본 클래스라고도합니다.

#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1 : public Employee {int salary public : Employee_1 (int s) {salary = s} int getSalary () {return salary}} class Employee_2 : public Employee {int salary public : Employee_2 (int t) {salary = t} int getSalary () {return salary}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

산출

설명
Employee 클래스의‘getSalary ()’함수는 순수한 가상 함수입니다. Employee 클래스에는 순수 가상 함수가 포함되어 있으므로 추상 기본 클래스입니다.
순수 가상 함수가 하위 클래스에 정의되어 있으므로 'getSalary ()'함수는 Employee 클래스의 두 하위 클래스 즉, Employee_1 및 Employee_2에서 정의됩니다.

C ++의 가상 기능에 대한이 기사로 이동

가상 기능의 예

#include using namespace std class base {public : void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

산출

SQL Server에서 피벗 및 피벗 해제

설명
function_1 () 함수 호출의 경우 함수의 기본 클래스 버전이 호출되고, function_2 ()가 파생 클래스에서 재정의되어 파생 클래스 버전이 호출되고, function_3 ()이 파생 클래스에서 재정의되지 않고 가상 함수이므로 기본 클래스 버전이 호출됩니다. 유사하게 function_4 ()는 재정의되지 않으므로 기본 클래스 버전이 호출됩니다.

따라서 우리는 'C ++의 가상 함수'에 대한이 기사를 끝냈습니다. 자세한 내용은 다음을 확인하십시오. 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 제공합니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Hibernate & Spring과 같은 다양한 Java 프레임 워크와 함께 핵심 및 고급 Java 개념 모두에 대해 교육하도록 설계되었습니다.

질문이 있으십니까? 이 블로그의 댓글 섹션에 언급 해 주시면 가능한 한 빨리 답변을 드리겠습니다.