latajacaryba Temat założony przez niniejszego użytkownika |
Java - tablica dla obiektów kalsy podstawowej zawierająca obiekty klasy pochodnej » 2017-08-01 03:07:18 Witam. W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. Znaczy jest to możliwe fizycznie, ale Jeśli obiekt T zajmuje 60 bajtów, a obiekt klasy dziedziczącej 80 bajtów, to przy odwołaniu się do pierwszego elementu nic się nie stanie, ale przy kolejnych program się wywali, bo wskaźnik będzie wskazywał element "oddalony" o 60 bajtów od pierwszego, a nie 80... w sumie, wiecie.
Teraz jak to jest z Javą? Tutaj możemy stosować coś takiego. Ale skąd ta tablica "wie" o ile bajtów powinna przesunąć... referencję? A w zasadzie ile "dodać" do adresu, który przechowuje. Mam nadzieję, że dobrze to objaśniłem. |
|
Monika90 |
» 2017-08-01 07:35:28 W Javie nie ma tablic obiektów, są tablice typów wbudowanych (int, float, itp) i są tablice referencji do obiektów (czyli tablice wskaźników). Ponieważ wszystkie referencje do obiektów zajmują tyle samo miejsca w pamięci, to nie ma problemu o który się martwisz. |
|
pekfos |
» 2017-08-01 13:13:58 W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. |
Możemy. Ale skąd ta tablica "wie" o ile bajtów powinna przesunąć... referencję? A w zasadzie ile "dodać" do adresu, który przechowuje. |
Po co tablica ma coś robić z przechowywaną referencją? |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-01 13:17:37 Ahh no tak, referencje... Ale w Javie nie ma chyba takiej inkrementacji tablic, jak w C++? Jak to tutaj wygląda? int * a = new int[ 5 ]; std::cout <<* a; a += 2; std::cout <<* a;
Natomiast w javie nie jest to możliwe. Dlaczego? Można byłoby zrobić coś takiego, szczególnie, że skoro rozmiary są stałe (bo to referencje) to wystarczy "przesuwać" referencję o 4 (lub 8) bajtów i wtedy taka referencja wskazuje na inną referencje... T tabl[] = new T[ 5 ]; T++;
Zastrzegam sobie prawo do popełnienia błędu w powyższych rozważaniach ;) EDIT @pekfos W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. | Możemy. |
W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. Znaczy jest to możliwe fizycznie, ale Jeśli obiekt T zajmuje 60 bajtów, a obiekt klasy dziedziczącej 80 bajtów, to przy odwołaniu się do pierwszego elementu nic się nie stanie, ale przy kolejnych program się wywali, bo wskaźnik będzie wskazywał element "oddalony" o 60 bajtów od pierwszego, a nie 80 |
Po co tablica ma coś robić z przechowywaną referencją? |
Mam tu na myśli sytuacje, jaka występuje w C++. W c++ możemy wykonywać operacje arytmetyczne na wskaźniku. Jeśli ten wskaźnik jest dynamicznie zaalokowany i wskazuje na tablice (element 0), to po inkrementacji go będzie wskazywał na element 1. Chciałbym się dowiedzieć, dlaczego nie ma czegoś takiego w javie... |
|
pekfos |
» 2017-08-01 13:45:15 W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. Znaczy jest to możliwe fizycznie, ale Jeśli obiekt T zajmuje 60 bajtów, a obiekt klasy dziedziczącej 80 bajtów, to przy odwołaniu się do pierwszego elementu nic się nie stanie, ale przy kolejnych program się wywali, bo wskaźnik będzie wskazywał element "oddalony" o 60 bajtów od pierwszego, a nie 80 |
|
Możemy. Bezpiecznie™. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-01 13:51:09 Cóż, może zostało to zmienione, ale w Symfonii Standard Grębosz pisze, że tak robić nie można. Możesz więc jakoś uargumentować swoje zdanie? |
|
Monika90 |
» 2017-08-01 14:06:43 Base a[ 5 ]; Derived x; a[ 0 ] = x;
Tak można robić, ale a[0] wciąż jest typu Base, jest to tzw. slicing. Być może tobie chodzi o to Derived a[ 5 ]; Base * p = a; ++p;
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-01 15:26:18 @Monika90 Tak, o to mi chodziło. W książce był podany przykład: void funk( K * );
int main() { KK tablPoch[ 10 ]; funk( tablPoch ); }
Czyli obcięcie następuje w przypadku przypisania obiektowi klasy podstawowej obiekt klasy pochodnej? Przy wskaźniku i referencji jest konwersja i wskaźnik/referencja klasy podstawowej może wskazywać na obiekt klasy pochodnej. A problem jest dopiero przy wskaźniku na tablicę. Więc pozostaje pytanie, co z javą: Jak rozumiem tablica w javie jest referencją, która wskazuje na inne referencje. Te inne referencje to komorki tablicy. jeśli to co napisałem jest prawdą, to dlaczego tej referencji nie możemy inkrementować, tak, jak wskaźnika na tablice w C++? |
|
« 1 » 2 |