Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassen im Code überschreiben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.09.2011, 16:36 Uhr
arcticlord



Hi,

ich suche nach einem C++ Äquivalent für folgenden Java Code


Code:
public class Main{
    public class Test{
        public void func(){
            System.out.println("Ausgabe Original");
        }
    }

    public void foo(final Test t){
        t.func();
    }
    
    public void run(){
        foo(new Test(){
            public void func(){
                System.out.println("Ausgabe Neu");
            }
        });
    }
    
    public final static void main(String[] args){
        new Main().run();
    }
}



Es geht mir hauptsächlich dabei um die Möglichkeit im Code die Klasse Test zu überschreiben.
Oder ist sowas in C++ grundsätzlich ein verkehrter Ansatz?

thx 4 answers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.09.2011, 17:17 Uhr
0xdeadbeef
Gott
(Operator)


Du leitest da stumpf von Test eine anonyme Klasse ab und überlädst die Methode func.

Folgendes ist in C++ anders:

1. Es gibt keine anonymen Klassen.
2. Methoden müssen explizit als virtuell gekennzeichnet werden, damit man sie auf diese Weise überladen kann.
3. Klassen sind keine Referenztypen.

Grob übersetzt käme dementsprechend Folgendes heraus:

C++:
#include <iostream>

class Test {
public:
  // Wenn du eine Klasse polymorphisch benutzen willst, solltest du den
  // Destruktor virtuell machen; sonst läufst du mit Heap-Allokation in
  // böse Probleme.
  // Ich schreibe die Methodenkörper hier der Kürze halber direkt in die
  // Klasse; üblicherweise schreibt man die in eine eigene
  // Übersetzungseinheit außerhalb der Klassendeklaration.
  virtual ~Test() { }
  virtual void func() const {
    std::cout << "Ausgabe Basisklasse" << std::endl;
  }
};

// Test_2 erbt von Test
class Test_2 : public Test {
public:
  virtual void func() const {
    std::cout << "Ausgabe Kindklasse" << std::endl;
  }
};

// Übergabe per Referenz. Das ist im Gegensatz zu Java nicht automatisch
// der Fall, und mit Wertübergabe würde hier aus dem Objekt der Klasse
// Test_2 ein Objekt der Klasse Test gebaut, wodurch der Teil, der Test_2
// ausmacht, verloren ginge (das nennt sich dann Slicing).
void foo(Test const &t) {
  t.func();
}

int main() {
  Test_2 t2;

  foo(t);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.09.2011 um 17:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: