c++ override 예제

By agosto 2, 2019Sem categoria

컴파일러는 메서드 func1이 메서드를 재정의하지 않는다고 16 줄에 불평합니다. func2도 마찬가지입니다. 잘못된 매개 변수 형식이 있습니다. 그것은 방법 func3에 간다. func3에는 const 한정자가 없습니다. func4에는 잘못된 반환 유형이 있습니다. 24줄의 메서드 f만 올바르게 작동했으며 기본 클래스의 메서드 f를 재정의합니다. 설명: 여기서 사용자는 파생 클래스의 func() 함수를 재정의하려고 했지만 어리석은 실수를 하고 다른 시그니처로 함수를 재정의했습니다. 컴파일러에서 검색되지 않았습니다. 그러나 이 프로그램은 실제로 사용자가 원하는 것이 아닙니다. 그래서, 안전한 측면에있을 이러한 바보 같은 실수를 제거하기 위해, 키워드를 재정의 사용할 수 있습니다. 다음은 C++에서 재정의 키워드의 사용을 보여 줄 C++ 예제입니다.

위의 예제에서 개체는 Derived 클래스이지만 여전히 Base 클래스의 메서드가 호출됩니다. 이는 초기 바인딩으로 인해 발생합니다. 또한 재지정자 지정여부에 관계없이 메서드를 재정의할 때 변환이 불가능합니다: 멤버 함수 선언 또는 정의에서 재정의는 함수가 가상이고 가상 함수에서 가상 함수를 재정의한다는 것을 확인합니다. 기본 클래스입니다. 프로그램이 잘못 형성되어(컴파일 타임 오류가 생성) 그렇지 않은 경우. 컴파일러는 매우 깔끔한 작업을 수행합니다. 클래스 베이스(라인 4)의 메서드 h가 클래스 파생(라인 9)의 메서드에 의해 재정의된다는 불평을 합니다. 물론 클래스의 메서드 h (10 줄)가 매개 변수 형식이중에 대해 파생 된 f를 오버로드하는 것은 괜찮습니다. 매우 흥미로운 것은 파생 클래스의 방법 g (라인 11)입니다. 메서드는 클래스 base의 메서드 g(줄 5)를 재정의하고 메서드를 최종으로 선언합니다. 따라서, g는 DerivedDerived(라인 15)에서 재래식될 수 없다.

내 의견으로는 C ++11의 재정의 지정을 사용하는 것은 깨끗한 코딩 원칙의 일부입니다. 그것은 저자의 의도를 밝혀, 그것은 코드를 더 읽기 쉽게 하고 빌드 시간에 버그를 식별하는 데 도움이됩니다. 적당히 사용하지 않고 사용! 두 경우 모두 virt-지정기-seq(경우)가 재사용 또는 최종 또는 최종 재정의 또는 최종 재정의입니다. 메서드를 재정의하려면 재정의 메서드의 시그니처가 정확히 일치해야 합니다. 쉬운 소리는 종종 실제로 그렇게 쉬운 일이 아니다 : 방법의 서명이 정확히 맞지 않으면 잘못된 행동으로 올바른 프로그램을 얻을 수 있습니다. 즉, 간단합니다, 다른 방법이 호출됩니다. 컨텍스트에 민감한 키워드 재정의 및 final을 사용하여 가상 함수의 재정의를 명시적으로 관리할 수 있습니다. 특히 키워드 재정의는 개체 계층구조에서 버그를 찾기 어려운 많은 문제를 해결합니다.