가상? 우세하다? 아니면 둘다? 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 {}
};
가장 좋은 방법은 무엇입니까?
당신이 함수를 재정의 할 때 기술적으로 쓰기 중 하나를 할 필요가 없습니다 virtual
나 override
.
원래 기본 클래스 선언 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
'Development Tip' 카테고리의 다른 글
이름이 PDB 명령과 충돌하는 변수를 어떻게 조작합니까? (0) | 2020.10.14 |
---|---|
휠 파일 설치 (0) | 2020.10.14 |
브라우저의 프로토콜 처리기를 감지하는 방법은 무엇입니까? (0) | 2020.10.14 |
C # "As"에 해당하는 VB.NET (0) | 2020.10.14 |
브라우저가 지원하는지 어떻게 알 수 있습니까? (0) | 2020.10.14 |