2012-09-07 17 views
6
  1. Czy wirtualne dziedziczenie używa vTable? Jeśli tak lub nie, to jak zaimplementowano
  2. Jak dziedziczenie wirtualne zachowuje się w pamięci?
  3. Każda inna alternatywa dla dziedziczenia wirtualnego

Naprawdę doceniam koncepcyjne wyjaśnienia.Jak działa wirtualne dziedziczenie?

+0

Określanie implementacji. – ildjarn

+0

Jest to zależne od implementacji, pod względem ściśle technicznym jest * Niespecyficzne *, standard C++ opisuje jedynie zachowanie wirtualnego dziedziczenia, ale nie określa sposobu jego implementacji. Zostało pominięte jako szczegół dla implementacji i nie są potrzebne do określenia tego szczegółu.Oczywiście, że większość (* odczytuje wszystkie znane *) kompilatorów używa wirtualnego mechanizmu tabeli i wskaźnika. –

+1

Powiedziawszy to powyżej, nie myśl, że Q jest nieistotny lub wcale nie jest prawdziwy. Wszystkie kompilatory używają podobnego mechanizmu i chociaż nie trzeba znać szczegółów implementacji, nie zaszkodzi to poznać. Ponadto, ten Q jest pytany tyle razy, że byłoby to dobre C++ - faq, jeśli ktoś zabiera czas i odpowiada na nie w przekonujący sposób. –

Odpowiedz

1

Wirtualne dziedziczenie jest realizowane w różny sposób w zależności od kompilatora.

1) Tak, zarówno vc, jak i gcc używają wskaźnika vTable. Ale vc ma inny wskaźnik ref jako wirtualny wskaźnik bazowy.

2) W przypadku klasycznego wirtualnego dziedziczenia, np. Left < Top; Right < Góra; Dno < lewy i prawy Stos powinien być tak:

Left.vptr // -> to its vtable 

Left::element_in_left 

Right.vptr 

Right::element_in_right 

Bottom::element_in_bottom 

Top::element_in_top 

Programy używać vptr znaleźć vtable dla gcc, nie jest wirtualny bazowa wartość offsetu w rentowne. vptr + offset bazy daje adres nadrzędny.

3) Nie jestem pewien co masz na myśli. Istnieją różne sposoby jego implementacji w kompilatorach C++. Inne języki mają swoje sposoby łączenia funkcji.

+0

Dziękuję bardzo! Wydaje się, że przestał być skomplikowany! Czy mógłbyś polecić mi jakiś prosty artykuł lub książkę, żeby przeczytać o tym. –

+0

@NayanaAdassuriya Czytałem tę wiedzę w moich wypowiedziach w języku ojczystym, więc nie znam książek w języku angielskim. Domyślam się, że możesz wyszukać "dziedziczenie wirtualne w pamięci wirtualnej" w google, istnieje wiele świetnych postów. – halfelf