2011-01-28 6 views
6

C++/CLI에 표준 C++에 존재하지 않는 키워드 (AFAIK)가 있음을 발견했습니다 : override.가상 함수의 명시 적 재 지정

저는 C++/CLI에 대해 잘 모릅니다. 그래서 누군가가 거기에 포함 된 목적을 설명 할 수 있습니까? 그렇다면 C++에 추가되는 것이 바람직한 기능입니까?

+0

당신은 당신이 생각하는 키워드가의 어떤 말도하지 않았다. 그것은 "명백한"것인가? 그렇다면 표준 C++입니다. –

+3

@Wes Hardaker 사실 나는 말했습니다. 그것은 "오버라이드"키워드입니다. – kunigami

답변

12

override은 C++/CLI 및 Visual C++ 구현에서 사용할 수있는 Microsoft의 특수 키워드 확장입니다. Java의 @Override 주석 또는 C#의 override과 비슷하며 의도 한 것을 재정의하지 않은 경우를 대비하여 더 나은 컴파일 시간 검사를 제공합니다. 첫 번째 링크에서

:

재정 관리 형의 멤버가 기본 클래스 또는 기본 인터페이스 멤버를 오버라이드 (override) 할 필요가 있음을 나타냅니다. 재정의 할 구성원이 없으면 컴파일러에서 오류를 생성합니다.

override는 네이티브 대상 (/ clr 제외)에 대해 컴파일 할 때도 유효합니다. 자세한 정보는 지정자 재정의 및 원시 컴파일을 참조하십시오.

override는 상황에 맞는 키워드입니다. 자세한 내용은 상황에 맞는 키워드를 참조하십시오.

C++ 11 표준에서 override 지정자는 이제 표준화 된 키워드입니다. 지원은 여전히 ​​제한되어 있으며 page from Apache StdCxx, override은 GCC 4.7 이상, Intel C++ 12.0 이상 및 Visual C++ 2012 (Visual C++ 2005의 사전 표준화 지원)에서 지원됩니다. here에서

0

:

당신이 속성 또는 의 방법 에서 그것을 클래스를 파생 할 때 virtual 키워드 부모 클래스는, 당신은 방법 또는 속성을 무시하고 할 수없는 플래그를하는 경우 그것을 구현하십시오. 그러나 속성 또는 속성을 구현하기로 결정한 경우 이 속성 또는 메서드의 새 버전을 제공하고 있음을 나타내야합니다. 새 버전의 속성 또는 메서드를 제공하면 이 재정의 된 것으로 표시됩니다.

속성 또는 메서드를 재정의, 당신은 오른쪽으로 override 키워드를 작성 하여이를 표시해야합니다.

이제 몇 가지 예를 보려면 link을 따르십시오.

+0

override 키워드의 메커니즘을 설명합니다. 왜 도입되었는지 설명하지 않습니다. –

+0

Rob의 # 2와 마찬가지로 이것은 사실이 아닙니다. 기본 클래스에서 가상으로 선언 된 함수의 서명을 매치하는 것은 함수를 오버라이드하기에 충분하지만,'override' 키워드는 생략 될 수 있고 함수는 여전히 오버라이드됩니다. 거대한 양의 기존 코드를 깨지 않으면 서 새 키워드를 필수 항목으로 설정할 수 없습니다. –

1

이 컴파일러는 실수를 두 가지 방법으로 잡을 수 있습니다 : 당신이 당신의 클래스 override와 함수를 선언하면

  1. 을하지만, 기본 클래스는 컴파일러가 당신을 말할 수있는, 그 기능이 없습니다 너는 네가 생각한 것을 무시하지 않고있어. override을 사용할 수 없다면 컴파일러는 사용자의 오류를 인식하지 못합니다. 단순히 새로운 기능을 도입하려고했다고 가정합니다.

  2. 자손 클래스 (override 제외)에 함수가 있고 기본 클래스의 가상 함수와 동일한 함수를 선언하면 컴파일러에서 기본 클래스의 변경이 해당 함수의 의미에 영향을 미쳤음을 알릴 수 있습니다. 자손의 원래 선언. 하위 클래스는 override을 사용해야합니다. 그렇지 않으면 함수 중 하나의 시그니처를 변경해야합니다.

이 기능은 이미 C++ 0x에 추가되었습니다.

+1

# 2가 사실이라고 생각하지 않습니다. 실제로 'override' 키워드를 사용하지 않고도 함수를 재정의 할 수 있습니다. 이것이 변경되면 기존 코드가 많이 손상됩니다. –

0

C++/CLI의 override 키워드는 .Net에서 비롯되었으며 C++ 자체의 일부는 아닙니다. 재정의는 이미 설명 했으므로 대안을 알아야합니다. 당신이 그것을 "오버라이드"하지 않는다면, 당신은 그것을 "새로운"상태로 만들고 싶을 것입니다. 이 클래스를 "new"로 설정하면 자식의 부모 클래스 멤버를 재정의하지 않고 동일한 이름의 새 멤버를 만들 수 있습니다. new 및 override 키워드는 기본 클래스 포인터를 사용하고 파생 클래스 객체를 가리킬 때만 다릅니다. 당신이 파생 클래스의 개체에 대한 기본 클래스 포인터와 포인트를 사용하는 경우

그래서 :

If you call an "override"n member: 
     the derived class member is called 
if you call the "new"ed member: 
     the base class member is called.