Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler bei Vererbung von Klassen

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 < [ 2 ]
000
12.05.2006, 13:47 Uhr
~Robtschick
Gast



C++:
#include <iostream>
#include <string>

using namespace std;

/*---------------------------------------Elektro-----------------------------------*/
class elektro
{

public:
    elektro();
~elektro();

float getSpeicher();
void setSpeicher(float arbeit);

    
    void display();

private:

    float speicher;

};

/*---------------------------------------Computer-----------------------------------*/

class computer: public elektro

{
public:

    computer();
~computer();

     float getGrafikkarte();
     void setGrafikkarte(float grafik);

    void display();



private:

    float grafikkarte;



};

/*---------------------------------------Laptop-----------------------------------*/
class laptop: public elektro

{
public:

    laptop();
    ~laptop();

    int getWlan();
    void setWlan(int w);

void display();



private:

    int wlan;

};



C++:
#include "basis.h"
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int auswahl;



int main()
{

    elektro *zeiger;



    int w;
    float grafik, arbeit;
    string neustart;

cout <<"Bitte wahlen sie aus Elektro (1) Computer (2) Laptop (3):";
cin>>auswahl;

switch(auswahl)
    {
    case 1: zeiger = new elektro;break;
    case 2: zeiger = new computer;break;
    case 3: zeiger = new laptop;break;
    default:    
        cout <<"Falsch gewaehlt\n" <<endl;
    break;
    }
    
do{
cout <<"Wie viel Arbeitsspeicher:" ;
cin >>arbeit;
}
while (arbeit <1 && arbeit >= 1000);

zeiger->setSpeicher(arbeit);
zeiger->display();

if(auswahl==2)
{
    do{
    cout <<"Wie viel Grafikspeicher:" ;
    cin >>grafik;
    zeiger->display();
    zeiger->setGrafikkarte(grafik);
    zeiger->setSpeicher(arbeit);

    }while (grafik <1 && grafik >=256);
}


if( auswahl==3)
{
    do{
    cout <<"Wie viele W-Lan kanaele:" ;
    cin >>w;
    zeiger->display();
    zeiger->setSpeicher(arbeit);
    zeiger->setWlan(w);

    }while (w <1 && w >=256);


}

cout <<" neustart Fragezeichen ja (j) nein (n) " <<endl;
cin >> neustart;
if (neustart=="j")
{
    
system("cls");
main();

}

else{
return 0;
}
return 0;

}
    




C++:
#include "basis.h"


//              KLASSE ELEKTRO

elektro::elektro()
{
cout <<" Klasse E baue auf\n" <<endl;
}

elektro::~elektro()
{
cout <<" Klasse E zerstoere\n" <<endl;
}

float elektro::getSpeicher()
{
return speicher;
}

void elektro::setSpeicher(float arbeit)
{
speicher=arbeit;
}

void elektro::display()
{
cout <<" Der Arbeitsspeicher betraegt " <<speicher<<endl;

}

//                KLASSE COMPUTER

computer::computer()
{

cout <<" Klasse C baue auf\n" <<endl;
}

computer::~computer()
{
cout <<" Klasse C zerstoere\n" <<endl;
}

float computer::getGrafikkarte()
{
return grafikkarte;
}

void computer::setGrafikkarte(float grafik)
{
grafikkarte=grafik;
}

void computer::display()
{
cout <<" Der Grafikspeicher betraegt " <<grafikkarte;
}

//                    KLASSE LAPTOP


laptop::laptop()
{
cout <<" Klasse L baue auf\n" <<endl;
}


laptop::~laptop()
{
cout <<" Klasse L zerstoere\n" <<endl;
}

int laptop::getWlan()
{
return wlan;
}

void laptop::setWlan(int w)
{
wlan=w;
}

void laptop::

display()
{
cout <<" Die W-Lan Geschwindigkeit betraegt:" <<wlan;
}


Wie ich schon sagte ich will aus einer Basisklasse ein element vererben , das dann bei der unterklasse mit angezeigt werden soll.
Wie soll ich das anstellen.. Ich bin ein echter noob also bitte dringend helfen

fehler sind

--------------------Konfiguration: elektro - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
CDokumente und Einstellungen\Robtschick\Desktop\C\Elektro2\Elektro\elektro\main.cpp(51) : error C2039: 'setGrafikkarte' : Ist kein Element von 'elektro'
cdokumente und einstellungen\robtschick\desktop\c\elektro2\elektro\elektro\basis.h(8) : Siehe Deklaration von 'elektro'
CDokumente und Einstellungen\Robtschick\Desktop\C\Elektro2\Elektro\elektro\main.cpp(65) : error C2039: 'setWlan' : Ist kein Element von 'elektro'
cdokumente und einstellungen\robtschick\desktop\c\elektro2\elektro\elektro\basis.h(8) : Siehe Deklaration von 'elektro'
Fehler beim Ausführen von cl.exe.

elektro.exe - 2 Fehler, 0 Warnung(en)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.05.2006, 16:32 Uhr
Th



Du hast die Vererbung falsch verstanden.
Die Methode 'setGrafikkarte' ist keine virtuelle Methode der Basisklasse Elektro, daher kannst du nicht mittels des Basisklassen-Zeiges 'zeiger' darauf zugreifen.
Du mußt dann dafür explizit in den passenden Klassenzeiger casten, z.B.


C++:
computer *zeiger2 = dynamic_cast<computer*>(zeiger);
zeiger2->setGrafikkarte(grafik);



Die Methode 'void Elektro::display()' solltest du außerdem noch virtuell machen.

Aber am besten, du liest dir noch mal ein Buch oder Tutorial über Vererbung durch...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.05.2006, 16:57 Uhr
~Robtschick
Gast



C++:
#include "basis.h"
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int auswahl;



int main()
{



    int w;
    float grafik, arbeit;
    string neustart;

    elektro *zeiger;
    computer *zeiger2 = dynamic_cast<computer*>(zeiger);
    laptop *zeiger3 =dynamic_cast<laptop*>(zeiger);
    

    

cout <<"Bitte wahlen sie aus Elektro (1) Computer (2) Laptop (3):";
cin>>auswahl;

switch(auswahl)
    {
    case 1: zeiger = new elektro;break;
    case 2: zeiger = new computer;break;
    case 3: zeiger = new laptop;break;
    default:    
        cout <<"Falsch gewaehlt\n" <<endl;
    break;
    }
    

cout <<"Wie viel Arbeitsspeicher:" ;
cin >>arbeit;


zeiger->setSpeicher(arbeit);
zeiger->display();

if(auswahl==2)
{
    do{
    cout <<"Wie viel Grafikspeicher:" ;
    cin >>grafik;
    zeiger2->setArbeitsspeicher(arbeit);
    zeiger2->setGrafikkarte(grafik);
    zeiger2->display();

    }while (grafik <1 && grafik >=256);
}


if( auswahl==3)
{
    do{
    cout <<"Wie viele W-Lan kanaele:" ;
    cin >>w;
    zeiger->display();
    zeiger3->setSpeicher(arbeit);
    zeiger3->setWlan(w);

    }while (w <1 && w >=256);


}

cout <<" neustart Fragezeichen ja (j) nein (n) " <<endl;
cin >> neustart;
if (neustart=="j")
{
    
system("cls");
main();

}

else{
return 0;
}
return 0;

}
    



nun hab ich 3 fehler und die sind auch ganz komisch

--------------------Konfiguration: elektro - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
CDokumente und Einstellungen\Robtschick\Desktop\C\Elektro\elektro\main.cpp(22) : error C2683: dynamic_cast : 'elektro' ist kein polymorpher Typ
cdokumente und einstellungen\robtschick\desktop\c\elektro\elektro\basis.h(8) : Siehe Deklaration von 'elektro'
CDokumente und Einstellungen\Robtschick\Desktop\C\Elektro\elektro\main.cpp(23) : error C2683: dynamic_cast : 'elektro' ist kein polymorpher Typ
cdokumente und einstellungen\robtschick\desktop\c\elektro\elektro\basis.h(8) : Siehe Deklaration von 'elektro'
CDokumente und Einstellungen\Robtschick\Desktop\C\Elektro\elektro\main.cpp(54) : error C2039: 'setArbeitsspeicher' : Ist kein Element von 'computer'
cdokumente und einstellungen\robtschick\desktop\c\elektro\elektro\basis.h(28) : Siehe Deklaration von 'computer'
Fehler beim Ausführen von cl.exe.

elektro.exe - 3 Fehler, 0 Warnung(en)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.05.2006, 17:12 Uhr
lich



Wenn ich mich gut erinnere, musst du wenigstens eine virtuelle Methode in elektro haben, um dynamic_cast zu benutzen.
Dieser Post wurde am 12.05.2006 um 17:17 Uhr von lich editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.05.2006, 17:20 Uhr
ao

(Operator)



Zitat von ~Robtschick:
nun hab ich 3 fehler und die sind auch ganz komisch

Die sind überhaupt nicht komisch, sondern völlig logisch. Wenn du Th's Hinweis befolgt hättest (Buch lesen!), fändest du das wahrscheinlich auch.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.05.2006, 17:47 Uhr
~Robtschick
Gast


Kommt schon ich habe alles mögliche getan ...

und auch alles bevolgt..
helft bitte das letzte mal

ein fehler nur noch

Kompilierung läuft...
basis.cpp
CDokumente und Einstellungen\Robtschick\Desktop\C\Elektro\elektro\basis.cpp(19) : error C2723: 'display' : Speicherklassenbezeichner 'virtual' ungueltig fuer Funktionsdefinition
Fehler beim Ausführen von cl.exe.

elektro.exe - 1 Fehler, 0 Warnung(en)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.05.2006, 17:50 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Steht doch alles da ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.05.2006, 17:57 Uhr
~Robtschick
Gast


IST KLAR...

JETZT NOCHMAL AUF DEUTSCH
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.05.2006, 17:59 Uhr
~Robtschick
Gast


Der zeigt jetzt auf das virtual was ich neu gemacht habe ...



C++:
#include "basis.h"


//              KLASSE ELEKTRO



float elektro::getSpeicher()
{
return speicher;
}

void elektro::setSpeicher(float arbeit)
{
speicher=arbeit;
}

virtual void elektro::display()
{
cout <<" Der Arbeitsspeicher betraegt " <<speicher<<endl;
}

//                KLASSE COMPUTER



float computer::getGrafikkarte()
{
return grafikkarte;
}

void computer::setGrafikkarte(float grafik)
{
grafikkarte=grafik;
}

void computer::display()
{
cout <<" Der Grafikspeicher betraegt " <<grafikkarte;
}

//                    KLASSE LAPTOP





int laptop::getWlan()
{
return wlan;
}

void laptop::setWlan(int w)
{
wlan=w;
}

void laptop:: display()
{
cout <<" Die W-Lan Geschwindigkeit betraegt:" <<wlan;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.05.2006, 18:17 Uhr
lich



Statt:

C++:
virtual void elektro::display()
{
cout <<" Der Arbeitsspeicher betraegt " <<speicher<<endl;
}




C++:
void elektro::display()
{
cout <<" Der Arbeitsspeicher betraegt " <<speicher<<endl;
}



Deklaration in der Klasse ist aber virtual.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: