인라인 가상 함수는 정말 신화일까요?
코드 리뷰에서 "가상 함수는 인라인일 필요가 없습니다"라는 코멘트는 다음에 대한 의문을 제기합니다. 인라인 가상 함수 사용. 잠재적인 이점에도 불구하고 실용성에 대한 의문이 제기됩니다.
객체에서 함수가 직접 호출되는 시나리오에서는 인라인 가상 함수가 적합해 보일 수 있습니다. 그러나 메소드 호출에 객체가 사용된다면 왜 가상 함수가 사용되는지 궁금할 수도 있습니다.
아래 코드 조각은 문제를 예시합니다.
class Temp { public: virtual ~Temp() {} virtual void myVirtualFunction() const { cout << "Temp::myVirtualFunction" << endl; } }; class TempDerived : public Temp { public: void myVirtualFunction() const { cout << "TempDerived::myVirtualFunction" << endl; } }; int main() { TempDerived aDerivedObj; // Compiler expands virtual functions aDerivedObj.myVirtualFunction(); // Object type for Temp* is known Temp* pTemp = &aDerivedObj; pTemp->myVirtualFunction(); return 0; }
컴파일러는 가상 함수를 인라인할 수 있지만 객체의 정확한 클래스가 알려지면(예: aDerivedObj) 호출하지만 포인터를 통해 객체에 액세스할 때는 그렇게 할 수 없습니다. (pTemp).
이러한 제한은 다음과 같은 질문을 제기합니다. 인라인 가상 기능의 확장이 제한되는 경우가 많기 때문에 피해야 할까요?
답변:
C FAQ에 설명된 대로 특정 상황에서 가상 함수를 인라인할 수 있습니다.
"인라인 가상 함수가 인라인되는 유일한 시간 호출이 인라인될 수 있는 것은 컴파일러가 가상 함수 호출의 대상인 객체의 '정확한 클래스'를 알고 있는 경우입니다. 이는 컴파일러에 객체에 대한 포인터나 참조가 아닌 실제 객체가 있는 경우에만 발생할 수 있습니다. 🎜>
위 내용은 인라인 가상 함수는 신화일까요, 아니면 단지 오해일까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!