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

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

27.05.2009, 17:43

Problem mit virtual / Polymorphie

Hallo

Ich habe eine Klasse A, in der einige Memberfunktionen als pure-virtual deklariert sind:

C-/C++-Quelltext

1
2
3
4
5
class A
{
public:
    virtual void set (const int& n) = 0;
};


Von A abgeleitet gibt es eine Klasse B, die diese Funktionen definiert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class B : public A
{
public:
    void set (const int& n);

private:
    B (const B&) { }
};


Ferner habe ich noch eine Klasse C, die von B abgeleitet ist, und D, die von C abgeleitet ist.
Sowohl C als auch D haben einen als public deklarierten Copy-Konstruktor.

Nun habe ich eine Funktion, die folgendermaßen definiert ist:

C-/C++-Quelltext

1
2
3
4
void f (D& d)
{
d.set (1);
}


Beim Ausführen bekomme ich an dieser Stelle einen Segmentation Fault.
Definiere ich es hingegen wie folgt, funktioniert es:

C-/C++-Quelltext

1
2
3
4
void f (D& d)
{
(static_cast <D> (d)).set (1);
}


Warum ist das so? Wie kann ich es anstellen, dass es funktioniert, und das Erstellen einer Kopie von d vermeiden?
Könnte das Problem auch auf Stack Corruption zurückzuführen sein?

Vielen Dank im Voraus


PS. Dass es irgendwie mit den Copy-Konstruktoren zu tun hat, glaube ich nicht, da es nichts ändert, wenn ich den Copy-Konstruktor von A ebenfalls public mache.

Falls ihr noch mehr Informationen braucht, wie etwa die vollständigen Quelltexte, sagt bitte bescheid, ich wollte euch aber nicht direkt erschlagen ;)
<< an dieser Stelle ist eine Signatur verstorben >>

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

27.05.2009, 19:10

Geht problemfrei:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class A
{
public:
    virtual void set( int n ) = 0;
};

class B : public A
{
public:
    B() {}

    void set( int n )
    {
        printf( "B::set()\n" );
    }

private:
    B( const B& ) {}
};

class C : public B 
{
public:
    C() {}

    C( const C& )
    {
    }
};

class D : public C
{
public:
    D() {}

    D( const D& )
    {
    }
};

void foo( D& d )
{
    d.set( 1 );
}

int main()
{
    D x;
    foo( x );
}

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

27.05.2009, 19:44

Hat sich erledigt ... Der Fehler lag an anderer Stelle ... trotzdem danke.
<< an dieser Stelle ist eine Signatur verstorben >>

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

27.05.2009, 19:51

Zitat von »"the[V«

oid"]Hat sich erledigt ... Der Fehler lag an anderer Stelle ... trotzdem danke.


Trotzdem keine Ursache.

Werbeanzeige