2014-08-28 1 views
5

서브 클래스하지 않고 QWidget의 가상 함수를 재정의 싶습니다. java에서 가능합니다. 또한 C++의 방법이하위 클래스 화하지 않고 Qt/C++ 재정의 함수

overriding methods without subclassing in Java

확실하지 경우 :이 링크를 발견했다. 어떤 아이디어?

+1

나는 그것이 가능하지 않다고 생각합니다. 그러나 최종 목표가 Qt Creator의 디자인 모드에서 새 하위 클래스를 사용하는 것이라면 완벽하게 가능합니다. – Ali

+0

하위 클래스를 선택 하시겠습니까? –

+0

기본적으로 내가 10 개의 다른 클래스와 그 reimplement 할 필요가 각 클래스의 단 하나의 기능처럼 서브 클래스해야 할 것이기 때문에. 그래서 나는 약간의 시간을 절약 할 것이다. 그러나 알리가 말했듯이, 나는 또한 그것이 가능하다고 생각하지 않는다. – Cocomico

답변

11

상속없이 대체 할 수 없습니다. 링크 된 예제의 코드는 서브 클래스를 수행합니다. 아마도 혼란은 extends 키워드를 사용하지 않는다는 사실에서 비롯된 것입니다. XStream의 익명 하위 클래스를 만들고이 메서드를 재정의합니다. 이러한 클래스는 C++에서도 존재하며 유사한 코드가 가능합니다. 명명 규칙은 약간 다릅니다. 이름이 없지만 명명 된 인스턴스가있는 클래스는 이며 이름은입니다. 여기에 코드를 내 음역이 예는 C++에서 익명 클래스와 함께 할 수있는 방법을 보여주는 것입니다 :

class SomeClass { 
public: 
    void myMethod() { 
     class: public XStream { 
     protected: 
      MapperWrapper wrapMapper(const MapperWrapper& next) override { 
       return MapperWrapper(next); // the example is cut off here, persumably it's creating another nested anonymous class, but i'll keep this simple 
      } 
     } xstream; 
    } 
}; 

당신이 중 하나를 사용하여 QWidgetXStreamwrapMapper를 대체 할 수있는 당신이 그것을 무시하려는 경우 가상 클래스의 이 방법.

Java의 콜백에는 익명 클래스가 자주 사용됩니다. 하지만 C++에서 우리는 함수 포인터와 요즘 lambda를 가지고 있습니다. 이것은 아마도 이름없는 클래스의 사용이 Java에 비해 C++ 코드에서 훨씬 더 드문 이유 일 것입니다. 또한, C++ 11 이전에는 이름이없는 클래스가 템플릿 매개 변수로 허용되지 않았기 때문에 콜백 함수 작성자에게는 좋지 않은 선택이었습니다.

는 C++로, 익명 클래스 (또는 구조체) † 하나 더 명명 된 인스턴스가없는 하나가 될 것입니다. 외부 클래스의 멤버 일 수 있으며 익명 클래스의 멤버는 부모 클래스의 네임 스페이스에 가져옵니다. 단, 익명의 클래스는 표준에서 허용되지 않습니다. 그런 일에 대한 정의가 어떻게 될 수 있습니까? 음, 익명의 유니온 이고 익명의 클래스는 유사합니다. C11 표준에서는 익명 구조체가 허용됩니다.

7

Java 예제는 하위 클래스입니다. 단지 익명의 하위 클래스입니다. @Override 키워드는 진단을 돕기위한 것일 뿐이므로 메서드가 수퍼 클래스를 재정의하지 않으면 오류가 발생합니다. @Override을 제거해도 생성 된 코드에는 아무런 영향을 미치지 않습니다. C++ 11도 가지고 있습니다 - this link을 참조하십시오.

Java에서와 마찬가지로 하위 클래스를 선언하지 않고 가상 함수를 재정의 할 수 없습니다. Qt를 효과적으로 사용하려면 익숙해 져야합니다!

관련 문제