2013-06-26 17 views
17

Próbuję zrozumieć wpłynąć porządku dziedziczenia w C++ .. Spojrzałem w Internecie, ale nie mogłem znaleźć jasną i wystarczającą odpowiedź ...C++ stwardnienie kolejność dziedziczenia

Więc dla dobra pytanie, załóżmy są 2 klasy: klasa B i klasa C.

teraz określić:

class A1 : public B, public C{ ... }; 
class A2 : public C, public B{ ... }; 

Jaka jest różnica pomiędzy A1 i A2?

Wielkie dzięki!

+0

Pytanie interstingowe. Chciałbym poznać odpowiedź. Znalazłem ten link - http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr134.htm, który twierdzi, " Kolejność wyprowadzania jest istotna tylko w celu ustalenia kolejności domyślnej inicjalizacji przez konstruktorów i czyszczenia przez destruktory. " Może ktoś może to potwierdzić? – OldProgrammer

Odpowiedz

11

Kolejność wyprowadzania jest istotna tylko w celu ustalenia kolejności domyślnej inicjalizacji przez konstruktorów i czyszczenia przez destruktory.

Kolejność wyznaczania nie jest znacząca, z wyjątkiem przypadków określonych w semantyce inicjowania przez konstruktora (12.6.2), czyszczenia (12.4) i układu pamięci (9.2, 11.1). - koniec uwaga]”(§10.1/2)

z C++ dokumentacji IBM: Multiple inheritance

+1

Twoja odpowiedź byłaby lepsza, gdybyś wstawił cytat bezpośrednio, zamiast mieć link. –

+1

Cytat jest tam bezpośrednio? Czy może czegoś brakuje? – Haagenti

+0

Prawda, ale nieprzetworzone linki są tandetne:/ –

7

mówi C++ 11 Standard (§10.1):

Kolejność jest wyprowadzenie nie ma znaczenia, z wyjątkiem określonym przez semantyki inicjalizacji przez konstruktora (12.6.2), oczyszczania (12,4) i układ pamięci (9,2, 11,1).

trzy akapity wskazują, że przywoływane

  • Konstruktorzy są nazywane w kolejności zapisać je w dół (pierwsza klasa bazowa na liście jest skonstruowany pierwszy) (§12.6.2.10). Różne zasady dotyczą wirtualnych klas bazowych, które zawsze są zbudowane z najbardziej pochodnej klasy przed bezpośrednimi klasami podstawowymi.
  • Destruktory są wywoływane w odwrotnej kolejności konstrukcji (pierwsza klasa bazowa na liście jest niszczona jako ostatnia)
  • Układ pamięci jest nieokreślony. Nie wolno przyjmować żadnych założeń dotyczących układu klas w pamięci. Jedynym wyjątkiem są tak zwane klasy standard-layout (§9), które są w zasadzie strukturą typu C. Ale ponieważ nie mogą mieć więcej niż jednej klasy z niestatycznymi członkami w hierarchii klas, to pytanie tak naprawdę nie ma tu zastosowania.

Pamiętaj, że układ pamięci może być ważny. Na przykład, jeśli biblioteka zewnętrzna wykonuje naiwne rzutowania w stylu C, które zakładają, że część obiektu, która go interesuje jest na początku, może prowadzić do błędów czasu wykonywania, które są trudne do debugowania.

+3

Nie "rozważam" niczego. "zdefiniowana implementacja" została zdefiniowana w standardzie C89 ANSI, a ta sama definicja jest używana w C++. Jedynie rzeczy, które standard określają jako "implementacja zdefiniowana" są uważane za "implementację zdefiniowaną": ** jeśli coś jest "zdefiniowane przez implementację", to implementacja jest wymagana do udokumentowania tego **. Wdrożenie pozwala oczywiście również dokumentować wszystko, czego chce. Może opisywać kolejność oceny argumentów 'operator +', ale nie jest to wymagane. Może dokumentować układ tabeli vtable, ale nie jest to wymagane. – curiousguy

+0

"Na maszynie spoczywa odpowiedzialność za określenie układu" "implementacja musi również wybrać jedną kolejność oceny z dwóch możliwości za każdym razem, gdy piszesz' f (g(), h()) ', ale sposób, w jaki wybiera jeden jest rzadko opisane. Implementacja jest odpowiedzialna za wiele rzeczy, które nie są udokumentowane, z wyjątkiem kodu źródłowego. – curiousguy

+0

@cualny_guy Dokładnie to, co starała się wyrazić odpowiedź: _ Nie powinieneś przyjmować żadnych założeń dotyczących układu klasy_. Termin "zdefiniowany przez implementację" ma tutaj nieco inne znaczenie w mowie ISO i w mowie potocznej (co ma miejsce w przypadku wielu terminów używanych w standardzie). Aby uniknąć tego źródła nieporozumień, zmieniłem sformułowanie odpowiedzi. Moglibyśmy to zrobić w znacznie mniejszej ilości postów, gdyby Twój pierwotny post zawierał informacje od twojego drugiego do ostatniego. Dzięki, że zostałeś ze mną. – ComicSansMS