2014-06-13 9 views
14

Kiedy zastąpić funkcję wirtualnego:Czy powinienem ponownie określać "wirtualny", gdy przesłonię funkcję C++?

class Geoff 
{ 
public: 
    virtual int getArea() { return 0; } 
} 

powinienem określić „wirtualne”, kiedy znowu go zastąpić? Czy to ma jakieś znaczenie? Wiem, że oba sposoby wydają się działać dobrze, tylko zastanawiam się, czy jest w tym coś więcej.

class George : public Geoff 
{ 
public: 
    virtual int getArea() { return x*y; } 
} 
+0

To nie jest dupe, ale z pewnością jest powiązane. –

+0

@ 一 二三: to kiepski kandydat do duplikatu, ponieważ faktycznie pyta, czy możesz jakoś "zastąpić" funkcję *** bez *** używając wirtualnego słowa kluczowego (dobre odpowiedzi wyjaśniają różnicę między ukrywaniem a wirtualną wysyłką) . –

+1

@TonyD - to wyścig, który widzisz, aby być pierwszą osobą, która zmapuje pytanie, edytując go w coś, czego nie ma, lub wyłączając pytanie. ;-P –

Odpowiedz

26

Jeśli używasz C++ 11, należy użyć override zamiast, który oba dokumenty, że jesteś nadrzędne funkcję wirtualnego i kontrole, które istnieje pasujący funkcja wirtualnego w baza do nadrzędnych.

int getArea() override { return x*y; } 

w C++ 03 jest to stylistyczny wybór - umieścić virtual się, jeśli czujesz, że zwiększa wartość dokumentacji.

+2

Możesz również użyć polecenia 'final', aby zapobiec kolejnym przesłonięciom, a to pozwala kompilatorowi łatwiej wywoływać połączenia z tą funkcją. –

+1

Myślę, że jeśli wiesz, że GEORGE zostanie przedłużony, wtedy umieść go wirtualnie. Dla zrozumienia celu. –

+1

@ Al-mo Przykro mi, ale to zła rada. "Nadpisanie" jest wystarczająco jasne, pokazując, że metoda jest wirtualna. –

7

Nie, należy użyć przesłonić. (http://en.cppreference.com/w/cpp/language/override)

Zaletą jest błąd, jeśli metoda nie jest wirtualna w obiekcie nadrzędnym.

edit

Jak Mark zauważył, że również nie powiedzie się, jeśli podpis nie pasuje, natomiast wirtualne będzie cicho „sukces”. Przerażające cytaty są takie, że niedopasowana sygnatura ukryłaby metodę shadowingu w bazie i stworzyła nową wirtualną metodę, która nie ma związku.

+1

Sprawdza również, czy nadrzędna metoda ma zgodny podpis z nadpisaną metodą (że faktycznie nadpisuje metodę, tak). –

+0

@MarkGarcia To prawda, i dobry punkt, ponieważ nie chcesz przypadkowo przeciążać, próbując przesłonić. –

+0

Dzięki, nadpisanie nadal generuje ostrzeżenie dla mnie w VS2010, więc będę musiał spojrzeć na to z naszymi architektami. –