반응형
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
반응형
'IT Share you' 카테고리의 다른 글
I18N 안전은 무엇을 의미합니까? (0) | 2020.12.07 |
---|---|
Python 스크립트를 실행할 때 vcvarsall.bat를 찾을 수 없습니다. (0) | 2020.12.07 |
Python의 클래스 개체에서 새 인스턴스를 만드는 방법 (0) | 2020.12.07 |
트위터 부트 스트랩을 만드는 방법 (0) | 2020.12.07 |
facet_wrap 레이블을 완전히 제거하십시오. (0) | 2020.12.07 |