문제

일부 오래된 코드를 검색하는 동안 다음과 유사한 내용을 발견했습니다.

class Base
{
public:
    virtual int Func();
    ...
};

class Derived : public Base
{
public:
    int Func(); // Missing 'virtual' qualifier
    ...
};

코드는 경고 없이(레벨 4) 잘 컴파일되고(MS VS2008) 예상대로 작동합니다. Func 파생 클래스에 가상 한정자가 없어도 가상입니다.이제 약간의 혼란을 야기하는 것 외에 이 코드에 어떤 위험이 있습니까? 아니면 코드를 모두 변경해야 합니까? virtual 예선?

도움이 되었습니까?

해결책

그만큼 virtual 파생 클래스의 모든 재정의 함수로 전달됩니다.키워드 추가의 유일한 실제 이점은 Derived 클래스 정의를 관찰하는 사람이 의도를 즉시 알 수 있다는 점을 나타내는 것입니다. Func 가상입니다.

Derived를 확장하는 클래스에도 가상 Func 메서드가 있습니다.

참조: 가상 기능 MSDN에서.페이지를 아래로 스크롤하여 확인하세요.

그만큼 가상 키워드는 파생 클래스에서 재정의 함수를 선언 할 때 사용할 수 있지만 불필요합니다.가상 함수의 재정의는 항상 가상입니다.

다른 팁

다음은 우선 기능을 선언 할 필요가 없다는 흥미로운 결과입니다.

template <typename Base>
struct Derived : Base
{
    void f();
};

파생의 F가 가상인지 여부는 파생 된 것이 올바른 서명의 가상 함수 F를 갖는 기반으로 인스턴스화되는지 여부에 따라 다릅니다.

누군가가 한 번 나에게 한 번은 사양을 준수하지 않는 아주 오래된 C ++ 컴파일러가 모든 서브 클래스에 대해 가상을 설정해야한다고 말했습니다. 더 이상 문제가되지 않습니다.

이 관행을 따르는 한 가지 위험은 사람들이 가상이라는 기능에 대한 가상 키워드가 필요하다는 것을 인식하지 못할 수도 있다는 것입니다. 이것은 비 사건 기능의 개념이없는 언어 (예 : Java, RealBasic)가없는 언어에서 나오는 사람들 일 가능성이 높습니다. 결론으로서, 당신은 기능이 비 사건이어야하기 때문에 가상이 의도적으로 생략 된시기를 알 수 없습니다.

일부 코드 분석 도구가 상속 된 가상을 선택할만큼 똑똑하지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top