2011-06-11 2 views
4

C++에서 순수 가상 함수를 구현할 때 구현을 가상으로 만들어야한다는 모범 사례 가이드 라인이 있습니까? 이유는 무엇입니까?가상도 가상으로 구현합니까?

class Interface 
{ 
    public: 
    virtual void foobar() = 0; 
}; 

class Concrete 
    : public Interface 
{ 
    public: 
    virtual void foobar(); 
}; 

답변

13

중요하지 않습니다. Concrete에서

void foobar() 는 같은 선언 여부에 관계없이 virtual이며 Interface에서 void foobar() 우선합니다. 누군가가 작동하도록 virtual 키워드가 파생 클래스에 존재인지 아닌지는 중요하지 않지만

+4

가상 기능이 항상 가상 상태라는 것을 알지 못했습니다. 오늘 C++에 관해 뭔가를 배웠습니다. : D –

+0

몰랐습니다. 나는 당신이 가상으로 남아 있다고 말해야한다고 생각했다. "Concrete"객체를 가지고 있다면 컴파일러를 가상 함수 호출에서 제외 할 수 있습니다. –

+0

인터페이스 포인터를 통해 foobar()를 호출하면 컴파일러는 객체의 실제 유형을 알 수 없으므로 가상 함수 호출을해야합니다. 그러나, 콘크리트 객체에 대해 foobar()를 직접 호출하면 컴파일러는 vtable을 통하지 않고 함수에 대한 직접 호출을 생성 할 수 있습니다. – Ferruccio

7

, 나는 항상 에 필수 불가결 한 시간을 절약 자기 문서화 연습 것으로 나타났습니다은 그것을 포함 지금부터 2 년 후에 바로 코드를 사용하면 눈에 즉시 닿는 것보다 클래스에 더 많은 것이 있음을 알 수 있습니다.

+0

나는 이것이 선택적으로 C++ 11에서 시행하도록 컴파일러에 지시 할 수있는 규칙 중 하나라고 생각한다. 따라서 코드가 컴파일되지 않는다고 잊어 버린 경우. –

+0

@Dennis : ** 명백한 가상 함수 무시 ** : http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides –

관련 문제