Programming

가상 함수와 순수한 가상 함수의 차이점

procodes 2020. 5. 9. 10:26
반응형

가상 함수와 순수한 가상 함수의 차이점


가능한 중복 :
C ++ 가상 / 순수 가상 설명

순수한 가상 함수와 가상 함수의 차이점은 무엇입니까? "순수한 가상 기능은 본문이없는 가상 기능입니다"라는 것을 알고 있지만 이것이 의미하는 바는 무엇이며 실제로 아래 행에 의해 수행되는 작업은 무엇입니까?

virtual void virtualfunctioname() = 0

가상 함수는 클래스를

다형성 기본 클래스로

만듭니다. 파생 클래스는 가상 함수를 재정의 할 수 있습니다. 기본 클래스 포인터 / 참조를 통해 호출 된 가상 함수는 런타임에 해결됩니다. 즉, 정적 유형 대신 객체

동적 유형

이 사용됩니다 .

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

순수한 가상 함수는 선언이 다음과

=0

같이 끝나는 가상 함수입니다 .

class Base {
  // ...
  virtual void f() = 0;
  // ...

순수 가상 함수는 암시 적으로 클래스 를 명시 적으로 선언하는 키워드가있는 Java와 달리

추상적

으로 정의 된 클래스를 만듭니다 . 추상 클래스는 인스턴스화 할 수 없습니다. 파생 클래스는 상속 된 모든 순수 가상 함수를 재정의 / 구현해야합니다. 그렇지 않으면 추상적이 될 것입니다.C ++의 흥미로운 '기능'은 클래스가 구현 된 순수한 가상 함수를 정의 할 수 있다는 것입니다. (

좋은 점은 논쟁의 여지가

있습니다.)


C ++ 11 은 순수 가상 함수의 구문과 유사한

delete

and

default

키워드를 새롭게 사용했습니다 .

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

참조

이 문제

이것

의 사용에 대한 자세한 정보

delete

default

.


가상 함수의 경우 기본 클래스에서 구현을 제공해야합니다. 그러나 파생 클래스는 자체 구현으로이 구현을 대체 할 수 있습니다. 일반적으로 순수한 가상 함수의 경우 구현이 제공되지 않습니다.

=0

함수 선언이 끝나면 함수를 순수 가상으로 만들 수 있습니다 . 또한 순수한 가상 함수를 포함하는 클래스는 추상적입니다. 즉이 클래스의 객체를 만들 수 없습니다.


순수한 가상 함수는 일반적으로 기본 클래스에서 구현되지는 않지만 리프 하위 클래스에서 구현되어야합니다.다음과 같이 선언에 "= 0"을 추가하여 해당 사실을 나타냅니다.

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

그런 다음 순수한 가상 함수를 구현하지 않으면 서브 클래스를 선언하고 인스턴스화 할 수 없습니다.

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

 

override

컴파일러는 키워드 를 추가하여 동일한 서명을 가진 기본 클래스 가상 함수가 있는지 확인합니다.


실제로 C ++에서

순수한 가상 함수의 구현을 제공

할 수 있습니다 . 유일한 차이점은 클래스를 인스턴스화하기 전에 모든 순수 가상 함수를 파생 클래스로 구현해야한다는 것입니다.참고 URL :

https://stackoverflow.com/questions/2652198/difference-between-a-virtual-function-and-a-pure-virtual-function

반응형