Development Tip

가상?

yourdevel 2020. 10. 14. 21:21
반응형

가상? 우세하다? 아니면 둘다? C ++


지난 몇 주 동안 뭔가 가상과 재정의에 대해 내 두뇌를 괴롭 히고 있습니다. 가상 함수로 상속을 할 때 virtual컴파일러가 올바른 함수를 검색하도록 알리기 위해 추가해야한다는 것을 배웠습니다 . 그 후 C ++ 11에는 새로운 키워드 인 override가 있다는 것도 배웠습니다. 이제 조금 혼란 스럽습니다. 내 프로그램에서 가상 및 재정의 키워드를 모두 사용해야합니까, 아니면 둘 중 하나만 사용하는 것이 더 낫습니까?

나 자신을 설명하려면-내가 의미하는 코드 예제 :

class Base
{
public:
    virtual void print() const = 0;
    virtual void printthat() const = 0;
    virtual void printit() const = 0;
};

class inhert : public Base
{
public:
    // only virtual keyword for overriding.
    virtual void print() const {}

    // only override keyword for overriding.
    void printthat() const override {}

    // using both virtual and override keywords for overriding.
    virtual void printit() const override {}
};

가장 좋은 방법은 무엇입니까?


당신이 함수를 재정의 할 때 기술적으로 쓰기 중 하나를 할 필요가 없습니다 virtualoverride.

원래 기본 클래스 선언 virtual에는 가상으로 표시 하는 키워드 필요합니다 .

파생 클래스에서 함수는 ¹ 기본 클래스 함수와 동일한 유형을 갖는 방식으로 가상입니다.

그러나 override의도 한 재정의가 기술적으로 재정의가 아닌 경우 컴파일 오류를 생성하여 버그를 방지 할 수 있습니다. 예를 들어 함수 유형이 기본 클래스 함수와 정확히 같지 않습니다. 또는 기본 클래스의 유지 관리로 인해 해당 함수의 유형이 변경됩니다 (예 : 기본 인수 추가).

같은 방식으로 virtual파생 클래스 키워드는 추가 파생 클래스에서 함수가 여전히 가상임을 확인하여 이러한 버그를 더 미묘하게 만들 수 있습니다.

그래서 일반적인 조언은

  • 사용하여 virtual기본 클래스 함수를 선언.
    이것은 기술적으로 필요합니다.

  • override파생 클래스의 재정의에만 사용 합니다.
    이것은 유지 보수에 도움이됩니다.

예:

struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };

참고 :
¹ C ++는 공변 원시 포인터 및 원시 참조 결과를 지원합니다. 공분산을 사용하면 재정의 유형이 정확히 동일하지 않습니다. 호환되는 유형이 있습니다.

참고 URL : https://stackoverflow.com/questions/39932391/virtual-override-or-both-c

반응형