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

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

1

06.07.2008, 19:38

Funktion einer abgeleiteten Klasse in Basisklasse aufrufen

Hi
Ist es möglich, eine virtuelle Funktion, die in einer abgeleiteten Klasse definiert wurde in der Basisklasse aufzurufen (mit der Definition aus der abgeleiteten Klasse)? (und wenn ja: wie?)
cu
Signaturen werden überbewertet

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

06.07.2008, 19:44

Naja wenn ich dich richtig verstanden habe ist das genau der Zweck von virtual.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base {
public:
    virtual void test() = 0;
    void do() {
        test();
    }
}

class Impl {
public:
    virtual void test() {
        std::cout << "Hoooray!" << std::endl;
    }
}

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

3

06.07.2008, 19:55

Dein Code führt (nach setzen einiger Semikolons...) dazu:

Zitat


Verweis auf nicht aufgelöstes externes Symbol ""public: virtual void __thiscall Base::test(void)" (?test@Base@@UAEXXZ)" in Funktion ""public: __thiscall Base::Base(void)" (??0Base@@QAE@XZ)".
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
Signaturen werden überbewertet

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

06.07.2008, 20:01

wenn man eine nicht rein-virtuelle Methode schreibt, sollte es gehen. Warum das so nicht erlaubt ist, kann ich dir allerdings nicht beantworten, aber dazu wird sich garantiert einer unser Profis äußern.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

5

06.07.2008, 20:04

ich korregiere mich:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base {
public:
    virtual void test() = 0;
    void do() {
        test();
    }
};

class Impl : public Base {
public:
    virtual void test() {
        std::cout << "Hoooray!" << std::endl;
    }
};
[/code]

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

6

06.07.2008, 21:17

Zitat von »"Nox"«

wenn man eine nicht rein-virtuelle Methode schreibt, sollte es gehen.

Macht's aber nicht. Dann wird der Code ausgeführt, der in der Funktionsdefinition innerhalb der Basisklasse steht. Es kommt zwar keine Fehlermeldung mehr, aber das gewünschte Ergebnis wird trotzdem nicht erzielt.
Signaturen werden überbewertet

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

06.07.2008, 21:19

zeig mal deinen code. ich hab nen verdacht: du rufst net zufällig ne virtuelle methode im konstruktor der basisklasse auf? wenn ja: das geht net, bzw. tut was andres als du denkst ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

06.07.2008, 21:24

So, wie es da steht, sehe ich kein Problem. Ausser der falsche Gebrauch von do als Funktionsausdruck. Das alleine sollte schon einen Fehler geben. :roll:

EDIT:
@dot: Jop, das wäre auch meine Vermutung.

Zitat von »"ISO/IEC
14882 10.4/ 6"«

Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making
a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or
destroyed) from such a constructor (or destructor) is undefined.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

06.07.2008, 21:26

stimmt. aber schon der linkerfehler von vorhin deutet darauf hin dass nicht ganz das dortsteht, was xardias hier als bsp gepostet hat ;)

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

10

06.07.2008, 23:04

Zitat von »"dot"«

zeig mal deinen code. ich hab nen verdacht: du rufst net zufällig ne virtuelle methode im konstruktor der basisklasse auf? wenn ja: das geht net, bzw. tut was andres als du denkst ;)

sch****(schön)! Ich hab ganz vergessen, dass die Funktion, die u.a. die virtuelle Funktion aufruft vom Konstruktor aufgerufen wird...

Dann darf ich jetzt wohl ~500 Zeilen Code umstrukturieren

(Link)
Signaturen werden überbewertet

Werbeanzeige