Forum: PC-Programmierung Methoden überdecken


von Nils (Gast)


Lesenswert?

Hallo,

ich habe in einer Basisklasse eine Prototyp identische Methode wie in 
einer Kindklasse:
1
class c_uarttransceiver
2
{
3
  public:
4
    BYTE * dispatcher();                        
5
}; 
6
7
class c_dispatcher : public c_uarttransceiver
8
{
9
  public:
10
    BYTE * dispatcher();    
11
}; 
12
13
c_dispatcher test;
14
test.dispatcher();

Die Methode aus der Klasse c_dispatcher wird aber nicht überdeckt. Es 
wird die Methode aus uarttransceiver verwendet (auch bei 
unterschiedlichen Compilern).

Was mache ich hier falsch? Eigentlich sollte doch die Methode aus 
c_dispatcher verwendet werden oder?

Den Inhalt der Methoden habe ich erspart und das ganze auf das 
Wesentliche konzentriert.

Vielen dank schonmal!

von Daniel A. (daniel-a)


Lesenswert?

Vermutlich suchst du Virtual.

Ohne Virtual:
1
class a {
2
  public: void m(); // method 1
3
};
4
class b : a {
5
  public: void m(); // method 2
6
};
7
int main(){
8
  {
9
    a* x = new b();
10
    x->m(); // 1
11
  }
12
  {
13
    b* x = new b();
14
    x->m(); // 2
15
  }
16
}

Mit Virtual:
1
class a {
2
  public: virtual void m(); // method 1
3
};
4
class b : a {
5
  public: void m(); // method 2
6
};
7
int main(){
8
  {
9
    a* x = new b();
10
    x->m(); // 2
11
  }
12
  {
13
    b* x = new b();
14
    x->m(); // 2
15
  }
16
}

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

1
Macintosh:~ todi$ cat t.cpp
2
#include <iostream>
3
4
class c_uarttransceiver
5
{
6
  public:
7
    void dispatcher() {
8
        std::cout << "c_uarttransceiver" << std::endl;
9
    }
10
};
11
12
class c_dispatcher : public c_uarttransceiver
13
{
14
  public:
15
    void dispatcher() {
16
        std::cout << "c_dispatcher" << std::endl;
17
    }
18
};
19
20
int main() {
21
    c_dispatcher test;
22
    test.dispatcher();
23
}
24
Macintosh:~ todi$ g++ t.cpp && ./a.out
25
c_dispatcher
26
Macintosh:~ todi$

Beim meinem Compiler funktioniert es. Aber ich denke mal, Du hast uns 
auch nur die Hälfte der Geschichte erzählt.

mfg Torsten

von Noch einer (Gast)


Lesenswert?

>Aber ich denke mal, Du hast uns
>auch nur die Hälfte der Geschichte erzählt.

Beispiel zu weit vereinfacht?

int main() {
    c_uarttransceiver *test = new c_dispatcher();
    test->dispatcher();
}

von Marc (Gast)


Lesenswert?

Um den vorigen Beitrag zu ergänzen: In C++ existiert Polymorphie nur bei 
Zeigertypen. Den Unterschied zwischen statischem und dynamischem Typ 
eines Objekts zu verinnerlichen, kann allgemein sehr hilfreich sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.