Thread View: pl.comp.lang.c
9 messages
9 total messages
Started by Borneq
Fri, 18 Aug 2017 07:13
Podklasy, nie-wskaźniki a vector
Author: Borneq
Date: Fri, 18 Aug 2017 07:13
Date: Fri, 18 Aug 2017 07:13
8 lines
1108 bytes
1108 bytes
class A {}
class B:public A {dodatkowe pola}
class C:public A {inne pola}
Teraz mamy vector<A> vec;
czy do wektora można wstawić B lub C? gdyby to były wskaźniki, nie było
by problemu, ale jak działamy na wartościach to chyba wektor przydziela
pamięć tylko na A?
Re: Podklasy, nie-wskaźniki a vector
Author: Borneq
Date: Fri, 18 Aug 2017 07:35
Date: Fri, 18 Aug 2017 07:35
15 lines
1600 bytes
1600 bytes
W dniu 18.08.2017 o 09:13, Borneq pisze:
> class A {}
> class B:public A {dodatkowe pola}
> class C:public A {inne pola}
>
> Teraz mamy vector<A> vec;
> czy do wektora można wstawić B lub C? gdyby to były wskaźniki, nie było
> by problemu, ale jak działamy na wartościach to chyba wektor przydziela
> pamięć tylko na A?
Rozumiem że jak do wskaźnik A można przypisać wskaźnik na B lub C, tak
samo do A można przypisać B lub C - wtedy będzie kopiował tylko część
obiektu. No dobrze, a jak jest metoda wirtualna odwołująca się do innej
części obiektu? Czyli była by zasada: jeśli metod wirtualnych nie ma
możemy działać na obiektach, ale gdy są wtedy na wskaźnikach?
Re: Podklasy, nie-wskaźniki a vector
Author: bartekltg
Date: Fri, 18 Aug 2017 08:27
Date: Fri, 18 Aug 2017 08:27
18 lines
1806 bytes
1806 bytes
On Friday, August 18, 2017 at 9:13:10 AM UTC+2, Borneq wrote:
> class A {}
> class B:public A {dodatkowe pola}
> class C:public A {inne pola}
>
> Teraz mamy vector<A> vec;
> czy do wektora można wstawić B lub C?
Nie.
Zresztą, jakbyś chciał wstawić? ;-)
Jaką linijkę kodu być wpisał?
Zawsze (poza hakowaniem i kopiowaniem pamieci) będziesz
miał rzutowanie na A.
pzdr
bartekltg
Re: Podklasy, nie-wskaźniki a vector
Author: Borneq
Date: Fri, 18 Aug 2017 09:48
Date: Fri, 18 Aug 2017 09:48
14 lines
1329 bytes
1329 bytes
W dniu 18.08.2017 o 10:27, bartekltg pisze:
> Nie.
>
> Zresztą, jakbyś chciał wstawić? ;-)
> Jaką linijkę kodu być wpisał?
> Zawsze (poza hakowaniem i kopiowaniem pamieci) będziesz
> miał rzutowanie na A.
Taką:
class A { int a; };
class B :public A { int b; };
A a;
B b;
a = b ; <---- tu kopiuję fragment, potem mogę wstawić do wektora
Re: Podklasy, nie-wskaźniki a vector
Author: Borneq
Date: Fri, 18 Aug 2017 09:50
Date: Fri, 18 Aug 2017 09:50
11 lines
1439 bytes
1439 bytes
W dniu 18.08.2017 o 11:48, Borneq pisze:
> class A { int a; };
> class B :public A { int b; };
> A a;
> B b;
> a = b ; <---- tu kopiuję fragment, potem mogę wstawić do wektora
Mam rzutowanie na A. Teraz gdy wywołam wirtualną, która jest A i B tak:
a.wirtualna() to mi wywoła tylko z A?
w takim razie jaki sens wirtualnej, jak zachowuje się jak zwykła?
A w Pascalu na wskaźnikach a.wirtualna wołała o ile pamiętam z B
Re: Podklasy, nie-wskaźniki a vector
Author: bartekltg
Date: Fri, 18 Aug 2017 10:13
Date: Fri, 18 Aug 2017 10:13
26 lines
2351 bytes
2351 bytes
On Friday, August 18, 2017 at 11:50:42 AM UTC+2, Borneq wrote:
> W dniu 18.08.2017 o 11:48, Borneq pisze:
> > class A { int a; };
> > class B :public A { int b; };
> > A a;
> > B b;
> > a = b ; <---- tu kopiuję fragment, potem mogę wstawić do wektora
>
> Mam rzutowanie na A. Teraz gdy wywołam wirtualną, która jest A i B tak:
> a.wirtualna() to mi wywoła tylko z A?
A niby dlaczego? Przecież rzutowałeś, a jest typu A,
niczym wiecej.
Ta funcka jest wirtualna, ale odpowiedni wpis pokazuje na
wersję funkcji dla A, nie dla B.
> w takim razie jaki sens wirtualnej, jak zachowuje się jak zwykła?
Polimorfizm działa, jeśli masz wskaźniki.
> A w Pascalu na wskaźnikach a.wirtualna wołała o ile pamiętam z B
Prawie na pewno nie.
pzdr
bartekltg
Re: Podklasy, nie-wskaźniki a vector
Author: Borneq
Date: Fri, 18 Aug 2017 10:35
Date: Fri, 18 Aug 2017 10:35
43 lines
1807 bytes
1807 bytes
W dniu 18.08.2017 o 12:13, bartekltg pisze:
> Polimorfizm działa, jeśli masz wskaźniki.
>
>> A w Pascalu na wskaźnikach a.wirtualna wołała o ile pamiętam z B
>
> Prawie na pewno nie.
W Pascalu są tylko wskaźniki (chyba że przestarzały, nieużywany object
zamiast class)
więc działa jak w C dla wskaźników,
#include <iostream>
using namespace std;
class A
{
public:
virtual void v(){
cout << "z A" << endl;
}
};
class B: public A
{
public:
void v() {
cout << "z B" << endl;
}
};
int main()
{
A a;
B b;
a = b;
a.v();
B *pb = new B();
A *pa = pb;
pa->v();
return 0;
}
Za drugim razem jest polimorfizm, za pierwszym zaskoczenie że nie ma.
Re: Podklasy, nie-wskaźniki a vector
Author: M.M.
Date: Fri, 18 Aug 2017 12:46
Date: Fri, 18 Aug 2017 12:46
19 lines
2016 bytes
2016 bytes
On Friday, August 18, 2017 at 11:48:10 AM UTC+2, Borneq wrote:
> W dniu 18.08.2017 o 10:27, bartekltg pisze:
> > Nie.
> >
> > Zresztą, jakbyś chciał wstawić? ;-)
> > Jaką linijkę kodu być wpisał?
> > Zawsze (poza hakowaniem i kopiowaniem pamieci) będziesz
> > miał rzutowanie na A.
>
> Taką:
> class A { int a; };
> class B :public A { int b; };
> A a;
> B b;
> a = b ; <---- tu kopiuję fragment, potem mogę wstawić do wektora
Jeśli to kopiowanie naprawdę ma sens, to trzeba operator przypisania
przedefiniować.
Pozdrawiam
Re: Podklasy, nie-wskaźniki a vector
Author: M.M.
Date: Fri, 18 Aug 2017 12:51
Date: Fri, 18 Aug 2017 12:51
51 lines
2712 bytes
2712 bytes
On Friday, August 18, 2017 at 12:35:28 PM UTC+2, Borneq wrote:
> W dniu 18.08.2017 o 12:13, bartekltg pisze:
> > Polimorfizm działa, jeśli masz wskaźniki.
> >
> >> A w Pascalu na wskaźnikach a.wirtualna wołała o ile pamiętam z B
> >
> > Prawie na pewno nie.
>
> W Pascalu są tylko wskaźniki (chyba że przestarzały, nieużywany object
> zamiast class)
> więc działa jak w C dla wskaźników,
> #include <iostream>
> using namespace std;
>
> class A
> {
> public:
> virtual void v(){
> cout << "z A" << endl;
> }
> };
>
> class B: public A
> {
> public:
> void v() {
> cout << "z B" << endl;
> }
> };
>
> int main()
> {
> A a;
> B b;
> a = b;
> a.v();
> B *pb = new B();
> A *pa = pb;
> pa->v();
> return 0;
> }
>
>
> Za drugim razem jest polimorfizm, za pierwszym zaskoczenie że nie ma.
Ja bym nigdy tak nie napisał. Myślałem, że to:
> a = b;
nawet się nie skompiluje. Jak to może działać? Potencjalnie
kopiujemy więcej bajtów pod mniejszy obiekt. Kompilator sam
obcina bajty poza zakresem?
Pozdrawiam
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads