C++에서 순수 가상 함수를 구현할 때 구현을 가상으로 만들어야한다는 모범 사례 가이드 라인이 있습니까? 이유는 무엇입니까?가상도 가상으로 구현합니까?
class Interface
{
public:
virtual void foobar() = 0;
};
class Concrete
: public Interface
{
public:
virtual void foobar();
};
C++에서 순수 가상 함수를 구현할 때 구현을 가상으로 만들어야한다는 모범 사례 가이드 라인이 있습니까? 이유는 무엇입니까?가상도 가상으로 구현합니까?
class Interface
{
public:
virtual void foobar() = 0;
};
class Concrete
: public Interface
{
public:
virtual void foobar();
};
중요하지 않습니다. Concrete
에서
void foobar()
는 같은 선언 여부에 관계없이 virtual
이며 Interface
에서 void foobar()
우선합니다. 누군가가 작동하도록 virtual
키워드가 파생 클래스에 존재인지 아닌지는 중요하지 않지만
, 나는 항상 에 필수 불가결 한 시간을 절약 자기 문서화 연습 것으로 나타났습니다은 그것을 포함 지금부터 2 년 후에 바로 코드를 사용하면 눈에 즉시 닿는 것보다 클래스에 더 많은 것이 있음을 알 수 있습니다.
나는 이것이 선택적으로 C++ 11에서 시행하도록 컴파일러에 지시 할 수있는 규칙 중 하나라고 생각한다. 따라서 코드가 컴파일되지 않는다고 잊어 버린 경우. –
@Dennis : ** 명백한 가상 함수 무시 ** : http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides –
가상 기능이 항상 가상 상태라는 것을 알지 못했습니다. 오늘 C++에 관해 뭔가를 배웠습니다. : D –
몰랐습니다. 나는 당신이 가상으로 남아 있다고 말해야한다고 생각했다. "Concrete"객체를 가지고 있다면 컴파일러를 가상 함수 호출에서 제외 할 수 있습니다. –
인터페이스 포인터를 통해 foobar()를 호출하면 컴파일러는 객체의 실제 유형을 알 수 없으므로 가상 함수 호출을해야합니다. 그러나, 콘크리트 객체에 대해 foobar()를 직접 호출하면 컴파일러는 vtable을 통하지 않고 함수에 대한 직접 호출을 생성 할 수 있습니다. – Ferruccio