🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

9 total messages Started by Borneq Fri, 18 Aug 2017 07:13
Podklasy, nie-wskaźniki a vector
#309394
Author: Borneq
Date: Fri, 18 Aug 2017 07:13
8 lines
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
#309402
Author: Borneq
Date: Fri, 18 Aug 2017 07:35
15 lines
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
#309395
Author: bartekltg
Date: Fri, 18 Aug 2017 08:27
18 lines
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
#309396
Author: Borneq
Date: Fri, 18 Aug 2017 09:48
14 lines
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
#309398
Author: Borneq
Date: Fri, 18 Aug 2017 09:50
11 lines
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
#309399
Author: bartekltg
Date: Fri, 18 Aug 2017 10:13
26 lines
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
#309400
Author: Borneq
Date: Fri, 18 Aug 2017 10:35
43 lines
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
#309397
Author: M.M.
Date: Fri, 18 Aug 2017 12:46
19 lines
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
#309401
Author: M.M.
Date: Fri, 18 Aug 2017 12:51
51 lines
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