2014-04-09 25 views
5

Przeglądałem przez Internet, szukając odpowiedzi na moje pytania, ale nie mogłem znaleźć żadnych, więc oto jestem.Czysta funkcja wirtualna i przesłanianie (C++)

Czy to prawidłowe określenie nadpisanie do mojej funkcji, która pochodzi z czystym wirtualna:

class baseClass 
{ 
    public: 
     virtual void myFunction() = 0; 
} 

class derivedClass : public baseClass 
{ 
    public: 
     virtual void myFunction() override; 
} 

jest to prawidłowe?

Moje drugie pytanie brzmi: Czy muszę podać wirtualne w klasie pochodnej dla mojej funkcji, mimo że żadna klasa nie odziedziczy po mojej klasie pochodnej (będzie ona ostateczna)?

Dziękuję bardzo za odpowiedzi!

Odpowiedz

3

Czy to prawda?

Yes. Zastąpienie zapewnia, że ​​funkcja jest wirtualna i przesłania funkcję wirtualną z klasy bazowej. Program jest źle sformułowany (generowany jest błąd podczas kompilacji), jeśli nie jest to prawdą.

Czy muszę podać wirtualne w klasie pochodnej dla mojej funkcji, mimo że żadna klasa nie odziedziczy po mojej klasie pochodnej (będzie ona ostateczna)?

Nie, nie. Ale nawet jeśli zostawisz wirtualny specyfikator, pozostanie on wirtualny. Ponieważ została zadeklarowana jako wirtualna w twoim BaseClass.

Jeżeli jedna z funkcji element vf jest uznany jako wirtualne w bazie klasy i pewnej klasy pochodnych, który pochodzi, bezpośrednio lub pośrednio, z Base posiada deklarację dla funkcji składowej o tej samej

  • nazwa
  • lista typ parametru (ale nie typ zwracany)
  • CV-kwalifikacyjne
  • Ref-Kwalifikacje

Wtedy ta funkcja w klasie pochodnej jest również wirtualna (czy nie wirtualny parametr jest używany w deklaracji) i nadpisuje Bazę :: VF (czy nadpisanie słowo to jest używane w deklaracji ) . Baza :: vf nie musi być widoczna (może być zadeklarowana jako prywatna lub dziedziczona przy użyciu prywatnego dziedziczenia), aby zostać nadpisaną.

+0

OK, dziękuję za udział. Jeszcze jedno pytanie: dlaczego kompilator nie narzeka, gdy nie określam przesłonięcia w klasie pochodnej? – Silouane

+1

Specyfikator zastąpienia został wprowadzony w C++ 11. Zapobiega on omyłkowemu dodawaniu nowych funkcji, które Twoim zdaniem są przesłonięte.Na przykład jeśli błędnie zmienisz typ zwracania w DerivedClass, kompilator wystąpi z błędem, jeśli użyjesz specyfikatora przesłonięcia. Jeśli nie używasz specyfikatora przesłonięcia, to w końcu deklarujesz nową metodę wirtualną. – Sambuca

+1

Mam to, dziękuję jeszcze raz. – Silouane

1

Ponadto, należy pamiętać, że należy zdefiniować wirtualny destruktor (może być pusta jeden) w klasy bazowej, w celu zagwarantowania właściwego dealokacji zasobów w klasach pochodnych.

Powiązane problemy