Warsztat » Forum

[Programowanie] Wywołanie metody poprzez wskaźnik - dziwny błąd

Feb 10, 2008 | cmons |
39 wypowiedzi na 3 stronach:
1 2 3
Esidar
Feb 17, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

A potem się zastanawiaj, które konkretnie metody w tej sześćdziesiątej siódmej klasie pochodnej są przesłonięte, które są nowo wprowadzonymi metodami wirtualnymi, a które nic z tych dwóch... Oczywiście musisz sprawdzić wszystkie sześćdziesiąt sześć klas bazowych. Ach, jak temu C++ brakuje choćby takiego głupiego override.


Ja się nie muszę zastanawiać. Jeśli w klasie jest "SetPosition" to mnie nie interesuje czy jest wirtualna czy nie i czy ew. wywołuje metodę z klasy bazowej. Jeśli to jest mój kod, to wiem jak to działa, jeśli nie mój kod, to nie obchodzi mnie implementacja.

Jeśli chcesz mieć override to sobie zrób "#define override" i wszędzie wklejaj.
Liosan
Feb 18, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:
...Jeśli to jest mój kod, to wiem jak to działa...

Też miałem takie założenie 10 lat temu. Parę lat programowania i myślę inaczej... :) Ale Ty przecież też nie od wczoraj piszesz... więc pewnie każdemu co innego przeszkadza. Mi np. przeszkadza przesłanianie :)

Liosan
Aithne
Feb 20, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

ShadowDancer, jak ci tak bardzo zależy, to zamień to sześćdziesiąt siedem na piętnaście i sześćdziesiąt sześć na czternaście. Wiele to nie zmienia, roboty potem i tak trochę jest.
Nargil
Dec 13, 2007

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Ok faktycznie przyznaję się do błędu ;/ Moim zdaniem to jednak trochę nielogiczne. No cóż

Kod: 

#include <iostream>

class base
{
public:
   virtual void whoAreYou()
   {
      std::cout << "base" << std::endl;
   }
};

class ext1 : public base
{
public:
   void whoAreYou()
   {
      std::cout << "ext1" << std::endl;
   }
};

class ext2 : public ext1
{
public:
   void whoAreYou()
   {
      std::cout << "ext2" << std::endl;
   }
};

int _tmain(int argc, _TCHAR* argv[])
{
   base *b = new base();
   ext1 *e1 = new ext1();
   ext2 *e2 = new ext2();

   b->whoAreYou();
   static_cast<base*>(e1)->whoAreYou();
   //tu słusznie spodziewałem się "ext2"
   static_cast<base*>(e2)->whoAreYou();

   //tu niesłusznie spodziewałem się "ext1"
   static_cast<ext1*>(e2)->whoAreYou();

   system("pause");
}
tak wygląda output
Kod: base
ext1
ext2
ext2
yarpen
Dec 15, 2007

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Kwestia przyzwyczajenia. Dla mnie nielogicznie jest to rozwiazane w C#.
Kot
Jun 28, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:
Jeśli chcesz mieć override to sobie zrób "#define override" i wszędzie wklejaj.

Tak jak opisałem w komentarzu na blogu Xiona (http://xion.org.pl/2009/10/13/override-w-c-i-nie-tylko/#comment-6550), w MSVC jest keyword override :)
http://msdn.microsoft.com/en-us/library/41w3sh1c.aspx
ConayR
Jun 26, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

Cytat:
Jeśli chcesz mieć override to sobie zrób "#define override" i wszędzie wklejaj.

Tak jak opisałem w komentarzu na blogu Xiona (http://xion.org.pl/2009/10/13/override-w-c-i-nie-tylko/#comment-6550), w MSVC jest keyword override :)
http://msdn.microsoft.com/en-us/library/41w3sh1c.aspx

Nie w MSVC a w _managed_ C++. To poważna różnica, bo w ten sposób można by się upierać, że C++ to język z grabarzem pamięci.
bies
Jun 27, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

(...) w ten sposób można by się upierać, że C++ to język z grabarzem pamięci.
Grabarzem? Chodzi Ci od odśmiecacz? Toż w C++ znam przynajmniej 4, zarówno precyzyjne jak i konserwatywne (Śmieciuch, SGCL, Boehm i jakiś czwarty znaleziony na sf.net). Jeszcze nie widziałem kompaktującego ale wydaję mi się, że przy pewnych założeniach też da się napisać.
ConayR
Jun 28, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

Cytat:

(...) w ten sposób można by się upierać, że C++ to język z grabarzem pamięci.
Grabarzem? Chodzi Ci od odśmiecacz? Toż w C++ znam przynajmniej 4, zarówno precyzyjne jak i konserwatywne (Śmieciuch, SGCL, Boehm i jakiś czwarty znaleziony na sf.net). Jeszcze nie widziałem kompaktującego ale wydaję mi się, że przy pewnych założeniach też da się napisać.

Hmm? Ja nie mówię, że nie można - piszę jedynie, że jest różnica między "gołym" C++ a C++/CLR w środowisku MSVC. Dyskusja toczyła się o override w C++ "gołym" (nie napiszę zgodnym ze standardem, bo mi jakiś bojownik GCC kwiatki w ogrodzie podepcze) i stwierdzenie, że MSVC ma override mija się IMO z prawdą.
bies
Jun 29, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

(...) stwierdzenie, że MSVC ma override mija się IMO z prawdą.
Ale na override to ja się nie znam (nie używam C++/CLI). Pisałem tylko, że analogia z GC była do bani.
ConayR
Jun 29, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Czy GC jest wbudowanym ficzerem C++? Nie. Więc analogia poprawna - C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

Pomijam już logikę "porównałeś A do B; na A się nie znam, ale porównanie do B do bani"...

[size=5pt]* metodą opisaną wcześniej w wątku - #define override[/size]
bies
Jun 30, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

* metodą opisaną wcześniej w wątku - #define override [podkreślenia moje]
A myślałem, że mówisz poważnie...
ConayR
Jun 30, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

Cytat:

C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

* metodą opisaną wcześniej w wątku - #define override [podkreślenia moje]
A myślałem, że mówisz poważnie...

Rozumiem, że to komentarz poparty wiedzą na temat działania override w C++/CLR?
siso
Jun 30, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

Cytat:

C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

* metodą opisaną wcześniej w wątku - #define override [podkreślenia moje]
A myślałem, że mówisz poważnie...

Słuszna uwaga, bies.
Nie wystarczy napisać override. To musi być sprawdzenie, inaczej nie ma sensu. W Javie wykłada kompilację.
bies
Jun 30, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

Cytat:

A myślałem, że mówisz poważnie...

Rozumiem, że to komentarz poparty wiedzą na temat działania override w C++/CLR?
Nie, zdrowym rozsądkiem.

A co do wiedzy to już ją mam i nie zaimplementujesz (podpowiedź: zaimplementujesz tzn. będzie działać) override w C++. A GC (nie wszystkie typy, nie zawsze najwydajniej) tak. Masz coś do dodania z sensem? Bo jeśli chcesz się dalej przekomarzać to EOD z mojej strony.
Kot
Jul 4, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

ConayR, przeczytałeś chociaż artykuł z linka? Nie będę ci cytował, ale ułatwię i powiem, że wystarczy przeczytać trzy zdania.

Poza tym zastanów się po co ci zarządzany język do sprawdzenia przez kompilator czy w klasie bazowej jest metoda o tej samej nazwie.

Poziom twoich uwag = dno.
Strony:
1 2 3