Wenn ich dein Problem richtig verstanden habe, fehlt dir virtual vor den
Methoden, die du aufgerufen haben willst.
Ohne das virtual kommt der Compiler nicht auf die Idee, in den
Ableitungen nach einer Methode zu suchen.
1 | // Time-stamp: "18.09.21 18:30 bestellung.cpp klaus.wachtler@esolutions.de"
|
2 | //
|
3 | // g++ -Wall --std=c++17 bestellung.cpp -o bestellung && ./bestellung
|
4 |
|
5 | #include <iostream>
|
6 | #include <string>
|
7 | #include <list>
|
8 |
|
9 |
|
10 | class Bestellung
|
11 | {
|
12 | public:
|
13 | Bestellung( const std::string &name )
|
14 | : name( name )
|
15 | {
|
16 | }
|
17 |
|
18 | virtual void zeigDich()
|
19 | {
|
20 | std::cout << "ich bin eine Bestellung " << name << std::endl;
|
21 | }
|
22 |
|
23 | protected:
|
24 | std::string name;
|
25 | };
|
26 |
|
27 | class Expressbestellung: public Bestellung
|
28 | {
|
29 | public:
|
30 | Expressbestellung( const std::string & name )
|
31 | : Bestellung( name )
|
32 | {
|
33 | }
|
34 |
|
35 | virtual void zeigDich()
|
36 | {
|
37 | std::cout << "ich bin eine Expressbestellung " << name << std::endl;
|
38 | }
|
39 | };
|
40 |
|
41 | class Schneckenbestellung: public Bestellung
|
42 | {
|
43 | public:
|
44 | Schneckenbestellung( const std::string & name )
|
45 | : Bestellung( name )
|
46 | {
|
47 | }
|
48 |
|
49 | virtual void zeigDich()
|
50 | {
|
51 | std::cout << "ich bin eine Schneckenbestellung " << name << std::endl;
|
52 | }
|
53 | };
|
54 |
|
55 |
|
56 | int main( int nargs, char **args )
|
57 | {
|
58 | std::list< Bestellung* > meineliste;
|
59 | meineliste.push_back( new Bestellung( "per Bote" ) );
|
60 | meineliste.push_back( new Expressbestellung( "UPS" ) );
|
61 | meineliste.push_back( new Schneckenbestellung( "DHL kommt vielleicht auch irgendwann an" ) );
|
62 |
|
63 | for( auto it: meineliste )
|
64 | {
|
65 | it->zeigDich();
|
66 | }
|
67 | return 0;
|
68 | }
|
Gibt bei mir aus:
1 | klaus@lap7:~$ g++ -Wall --std=c++17 bestellung.cpp -o bestellung && ./bestellung
|
2 | ich bin eine Bestellung per Bote
|
3 | ich bin eine Expressbestellung UPS
|
4 | ich bin eine Schneckenbestellung DHL kommt vielleicht auch irgendwann an
|
Lasse ich die virtual weg, kommt nur noch:
1 | klaus@lap7:~$ g++ -Wall --std=c++17 bestellung.cpp -o bestellung && ./bestellung
|
2 | ich bin eine Bestellung per Bote
|
3 | ich bin eine Bestellung UPS
|
4 | ich bin eine Bestellung DHL kommt vielleicht auch irgendwann an
|
Das heißt, es wird ohne virtual immer die Methode aus der Basisklasse
genommen.