IT Share you

C ++ 순수 가상 함수에는 본문이 있습니다.

shareyou 2020. 12. 7. 21:10
반응형

C ++ 순수 가상 함수에는 본문이 있습니다.


순수 가상 함수 (우리가 설정했을 때 = 0)도 함수 본문을 가질 수 있습니다.

전혀 호출되지 않는 경우 순수 가상 함수에 대한 함수 본문을 제공하는 용도는 무엇입니까?


순수 가상 함수를 호출 할 수 없다는 당신의 가정은 완전히 틀립니다. 함수가 순수 가상으로 선언되면 단순히이 함수 가 가상 디스패치 메커니즘을 통해 동적으로 호출 될 수 없음을 의미합니다 . 그러나이 동일한 함수는 정적으로 , 비 가상적으로 , 직접 (가상 디스패치없이) 쉽게 호출 할 수 있습니다 .

C ++ 언어에서 함수의 정규화 된 이름이 호출에 사용될 때, 즉 호출에 지정된 함수 이름이 <class name>::<function name>형식을 가질 때 가상 함수에 대한 비가 상 호출이 수행됩니다 .

예를 들면

struct S 
{
  virtual void foo() = 0;
};

void S::foo() 
{
  // body for pure virtual function `S::foo`
}

struct D : S 
{
  void foo() 
  {
    S::foo();       
    // Non-virtual call to `S::foo` from derived class

    this->S::foo(); 
    // Alternative syntax to perform the same non-virtual call 
    // to `S::foo` from derived class
  }
};

int main() 
{
  D d;

  d.S::foo(); 
  // Another non-virtual call to `S::foo`
}

"Effective C ++"Meyers는 순수 가상 함수가 본문을 갖는 이유를 언급합니다.이 순수 가상 함수를 구현하는 파생 클래스는 코드에서이 구현을 smwhere로 호출 할 수 있습니다. 두 개의 서로 다른 파생 클래스의 코드 일부가 유사한 경우 함수가 순수 가상이어야하더라도 계층 구조에서 위로 이동하는 것이 좋습니다.

여기를 참조 하십시오 .


대부분의 순수한 가상 기능의 경우 귀하가 옳습니다. 그러나 순수 가상 소멸자의 경우 실제로 해당 소멸자 구현을 정의하는 것이 중요합니다.

  • "순수 가상"은 파생 클래스가 소멸자를 구현하도록 요구하는 것입니다.
  • 기본 클래스 소멸자 구현은 파생 된 클래스 소멸자가 나중에 성공적으로 "연결"할 수 있도록하는 것입니다.

참고 URL : https://stackoverflow.com/questions/5481941/c-pure-virtual-function-have-body

반응형