2011-01-28 10 views
6

Właśnie odkryłem, że C++/CLI ma słowo kluczowe, które nie jest obecne (AFAIK) na standardowym C++: override.Jawne zastąpienie funkcji wirtualnej

Nie wiem zbyt wiele o C++/CLI, więc czy ktoś może wyjaśnić, dla którego celu jest on tam zawarty i czy jest to pożądana funkcja dodana do C++?

+0

Ty nie powiedzieć, co kluczowe myślisz o to. Czy jest "wyraźny"? Jeśli tak, to jest w standardowym C++. –

+3

@W Hardaker Właściwie powiedziałem. Jest to słowo kluczowe "przesłonięcie". – kunigami

Odpowiedz

12

override to specjalne rozszerzenie słów kluczowych firmy Microsoft, które może być używane w implementacjach C++/CLI i Visual C++. Jest podobny do adnotacji @Override w języku Java lub override w języku C# i zapewnia lepsze kontrole czasu kompilacji na wypadek, gdyby nie zastąpiłeś czegoś, co miałeś na myśli.

Od pierwszego linku:

override oznacza, że ​​członek zarządzanym typu muszą zastąpić klasę bazową lub element interfejsu bazowej. Jeśli nie ma elementu do przesłonięcia, kompilator wygeneruje błąd.

Nadpisanie jest również ważne podczas kompilacji dla natywnych celów (bez/clr). Aby uzyskać więcej informacji, zobacz Zastąp specyfikatory i Rodzime kompilacje.

Zastąpienie to słowo kluczowe kontekstowe. Aby uzyskać więcej informacji, zobacz Słowa kluczowe kontekstowe.

Zgodnie ze standardem C++ 11 specyfikator override jest obecnie znormalizowanym słowem kluczowym. Wsparcie jest nadal ograniczone i zgodnie z tym page from Apache StdCxx, override jest obsługiwane przez GCC 4.7+, Intel C++ 12.0+ i Visual C++ 2012 (z obsługą wstępnej standaryzacji w Visual C++ 2005).

0

Od here:

Jeśli flaga do właściwości lub metody w klasa dominująca ze słowem kluczowym virtual , gdy wynikające klasę z go, można zignorować metodę lub własności, ale nie Wdrożyć je. Jeśli jednak użytkownik zdecyduje się wdrożyć właściwość lub metodę, musi wskazać, że użytkownik udostępnia nową wersję właściwości lub metody . Udostępnienie nowej wersji właściwości lub metody jest nadpisywane.

Kiedy przesłanianie właściwości lub metody , należy wskazać to przez pisząc słowa kluczowego override do jego rację.

Teraz spójrz na link, aby zobaczyć przykłady.

+0

To wyjaśnia mechanikę słowa kluczowego override. Nie wyjaśnia, dlaczego został wprowadzony. –

+0

Podobnie jak w przypadku Rob's # 2, nie jest to prawdą. Dopasowanie sygnatury funkcji deklarowanej jako wirtualna w klasie bazowej jest wystarczające do nadpisania funkcji, słowo kluczowe "override" może zostać pominięte, a funkcja będzie nadal nadpisywana. Nowe słowa kluczowe nie mogą być obowiązkowe bez łamania ogromnych ilości istniejącego kodu. –

1

Pomaga kompilator złapać swoje błędy na dwa sposoby:

  1. Jeśli zadeklarujesz funkcję z override w swojej klasie, ale klasa bazowa nie posiada tej funkcji, wówczas kompilator można powiedzieć, że nie przeważasz nad tym, o czym myślałeś, że jesteś. Jeśli override były niedostępne, kompilator nie byłby w stanie rozpoznać twojego błędu - po prostu zakładał, że zamierzasz wprowadzić nową funkcję.

  2. Jeśli masz funkcję w klasie potomków (bez override), a następnie deklarujesz tę samą funkcję jako wirtualną w klasie bazowej, kompilator może powiedzieć, że twoja zmiana w klasie bazowej wpłynęła na znaczenie oryginalna deklaracja w potomku. Potomek będzie musiał albo użyć override, albo będziesz musiał zmienić podpis jednej z funkcji.

Ta funkcja jest już dodana do C++ 0x.

+1

Nie sądzę, że # 2 jest prawdziwe. Możesz całkowicie pominąć funkcje bez użycia słowa kluczowego 'override'. Wiele istniejącego kodu pękłoby, gdyby to się kiedykolwiek zmieniło. –

0

Słowo kluczowe "override" w C++/CLI pochodzi z .Net, a nie z samej C++. Ponieważ zastąpienie zostało już wyjaśnione, musisz znać alternatywę. Jeśli nie "przesłonisz" go, możesz chcieć uczynić go "nowym". Przez uczynienie go "nowym" nie przesłonisz elementu klasy macierzystej dziecka, ale utworzysz nowego członka o tej samej nazwie. Nowe i zastępujące słowa kluczowe różnią się jedynie w przypadku użycia wskaźnika klasy bazowej i wskazywania go obiektowi klasy pochodnej.

Tak więc, jeśli użyć wskaźnika klasy bazowej i punkt do obiektu klasy pochodnej:

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. 
Powiązane problemy