2013-01-11 12 views
12

To pytanie jest podobna, ale jest o wywołaniu funkcji od wewnątrz klasy: Can I call a base class's virtual function if I'm overriding it?Czy istnieje sposób wywołania funkcji podstawowej poza klasą w C++?

W takim przypadku, można by określić Base::function() zamiast function(), który wywoła zastąpiona definicją.

Ale czy jest jakiś sposób na zrobienie tego poza klasą? Moja klasa nie definiuje konstruktor kopiujący, więc nie mogłem dowiedzieć się, jak rzucić jako klasy bazowej:

Base(derived_object).function() 

jest właściwą rzeczą do zrobienia tutaj, aby rzucić & derived_object jak Base* a następnie zadzwonić ->function()?

Dzięki za twój wgląd.

+1

'static_cast' może działać, chociaż nie jestem pewien - punktem funkcji wirtualnych jest to, że są one rozwiązywane w czasie wykonywania, niezależnie od typu czasu kompilacji obiektu.' Dynamic_cast' z pewnością nie zadziała. –

+0

Dlaczego chcesz? Jeśli funkcja jest częścią klasy pochodnej, a także klasy bazowej, prawdopodobnie robisz coś złego, gdy wywołujesz klasę podstawową. Lepszym sposobem rozwiązania tego problemu jest stworzenie oddzielnej funkcji w klasie bazowej, która ma być wywołana przez klasę pochodną, ​​i niech klasa bazowa wywoła tę funkcję. –

+0

Proszę zobaczyć komentarz do @Omnifarious poniżej. – user

Odpowiedz

18

Spróbuj derived_object.Base::function();

+0

Czy to standard? Jeśli tak, to wystarczy. – user

+1

@Oliver: Tak, to jest standard. – Mankarse

+4

@Over klasa :: function() to "pełna nazwa" funkcji członka. Jeśli nie określisz klasy dla wywoływanej funkcji, będzie to "domyślna" (wyprowadzona w twoim przypadku) jedna. – Eric

9

wierzę składnię:

derived_ptr->Base::function(); 

działa dobrze. Chociaż naprawdę zastanawiam się, dlaczego chciałbyś to zrobić w funkcji, która nie należy do twojej klasy. Zwłaszcza jeśli function jest funkcją wirtualną.

Powodem, dla którego jest to wątpliwy pomysł, jest to, że robisz cokolwiek, co używa tej notacji, zależy od hierarchii dziedziczenia twojej klasy. Poza tym funkcje są zwykle zastępowane z jakiegoś powodu. I omijasz to, używając tej składni.

+1

Dzięki - Mam obiekt Base, który tworzy raport, oraz obiekt Derived, który generuje raport (z dodatkowymi informacjami w raporcie podstawowym). Więc tworzę raport bazowy poprzez Base :: generate_report, a następnie skopiuję dodatkowe informacje. Odbywa się to poza klasą przy użyciu wzorca gości (lepsze oddzielenie obaw) - BaseReport jest skonstruowany z bazą, a DerivedReport z pochodną. Uff! – user

0

Prawdopodobnie chcesz użyć wskaźników do funkcji składowej klasy. Umożliwiają one w razie potrzeby mapowanie różnych funkcji klasy bazowej do wskaźnika oraz możliwość użycia go jako zmiennej lub parametru funkcji.

Składnia wskaźnik do funkcji składowej wygląda

class Base 
{ 
public: 
    virtual bool Function(); 
    virtual bool OtherFunction(); 
}; 

typedef bool (Base::*)() BaseFunc; 

Lista zastrzeżeń do korzystania z tych rzeczy jest mile długo tam jest mnóstwo w Internecie, w jaki sposób z nich korzystać (większość odpowiedzi są "nie"). Dają one jednak sposób wyraźnego wiązania się i wywoływania funkcji członka klasy podstawowej.

+0

Ta składnia typedef jest niepoprawna. – aschepler

Powiązane problemy