Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

30.08.2005, 17:03

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
  int a;
  virtual size_t getSize()const{return sizeof(a);};
};

class Derived : public Base
{
  int b;
  virtual size_t getSize()const{return Base::getSize() + sizeof(b);};
}

void doSomething(Base& b)
{

   cout << b.getSize();
}

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

22

30.08.2005, 17:09

Das "Base::getSize() +" ist glaub ich falsch...

23

30.08.2005, 17:11


24

30.08.2005, 17:16

[vc] neues consolenprojekt -> copy+paste

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <iostream>
#include <conio.h>


class B{
public:
int a;
virtual size_t getSize()const{return sizeof(a);};
};

class A:public B{
public:

    int b;
    virtual size_t getSize()const{return B::getSize()+sizeof(b);};
};

void bla(B &b){
    std::cout<<b.getSize()<<std::endl;
}

int main(){

    B b;
    A a;

    bla(b);
    bla(a);
    getch();

}


[ausgabe]

4
8

Anonymous

unregistriert

25

30.08.2005, 18:58

Erst mal vielen Dank für die vielen Antworten.

RTTI ist ein wirklich interessantes Thema und beantwortet eigentlich die meisten meiner fragen.

@ 23h Das ist zwar ein interessanter Ansatz, aber die Ausgabe ist nicht ganz richtig:
würdest du schreiben sizeof(B) bzw sizeof(A), würde die Ausgabe nicht 4 und 8, sondern 8 und 12 sein, weil der vfptr am anfang noch 4 byte groß ist.
Man könnte in die Funktion statt dessen reinschreiben sizeof(*this)
das gibt den richtigen wert ab, die funktion muss allerdings bei jeder ableitung überladen werden.

Eine Frage hab ich noch und zwar: Ist es möglich dynamisch herauszufinden, ob ein Objekt einen vfptr hat oder nicht? Sprich ob es "vererbt wurde oder nicht"? Auf die weise könnte man, wenn man objekte kopieren will indem man den speicher kopiert herausfinden, ob man einen vfptr beachten muss, oder nicht.

Anonymous

unregistriert

26

30.08.2005, 19:02

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct Base
{
    virtual size_t getSize()
    {
        return sizeof( Base );
    }

    int a, b, c, d;
};

struct Derived : Base
{
    size_t getSize()
    {
        return sizeof( Derived );
    }

    int e, g, f, h;
};

int main()
{
    Base base;
    Base* p = &base;

    cout << p->getSize() << endl;
    
    Derived derived;
    p = &derived;
    
    cout << p->getSize() << endl;
}

Anonymous

unregistriert

27

30.08.2005, 19:08

@Outsider Sowas ist alles den Compilerbauern überlassen, sprich da müsste nichtmal ne vtable vorhanden sein, wenn die sich was neues ausdenken. Wenn du sowas wirklich rausfinden willst, dann geht das wirklich nur Compilerspezifisch. Und brauchen tut man das doch höchstens aus reiner Neugier :)
Wenn du sowas wissen willst, dann ist der einfachste Weg sich nen Compiler zu schnappen, kleine Testprogramme zu schreiben und sie mit nem Debugger + Disassembler zu untersuchen.

Habe das selber noch nie gemacht, aber anscheinend kann man mit etwas Übung sehr schön erkennen, wie die Compiler das umsetzen (und anscheinend sogar welcher Compiler es war). Gibt da auch nen tolles Buch darüber, ich glaube es war "Hacker Disassembling Uncovered".

Anonymous

unregistriert

28

30.08.2005, 23:07

k compiler spezifität is nen argument

hatte mir nur überlegt, ob es, wenn man herausfinden könnte ob eine vftable vorhanden ist oder nicht, man mit diesem wissen zB beispiel einen Typenunabhängigen array anlegen könnte, klar viele wege führen nach Rom, aber das wäre ein sehr komfortabler gewesen, wenn er nicht so gehackt wäre ;)

trotzdem danke an alle, ich denke zu dem thema ist meine neugierde erstmal gestillt...

Anonymous

unregistriert

29

30.08.2005, 23:46

Wenn du sowas willst, solltest du dir mal boost::variant oder boost::any an.

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

30

06.09.2005, 16:37

Hast du bei deinem ganzen Vorhaben direkt die Daten byteweise zu kopieren auch mal über falche/tiefe Kopie nachgedacht? Das Thema sollte in diesem Zusammenhang sicher nicht vernachlässigt werden!
Why is 6 afraid of 7?
Because 7 8 9

Werbeanzeige