Geerbte Methoden überschreiben ?



  • Hallo,
    bin noch ziemlicher C++ Anfänger, und habe eine Frage:
    Ich habe eine Klasse A mit der Methode void funktionA()
    Ich habe eine Klasse B die die Klasse A erbt(über class B : public A)
    und funktionA überschreibt, sodass sie zwei ausgibt.
    Ich habe eine Klasse C, die auch Klasse A erbt und funktionA überschreibt, sodass sie drei ausgibt.
    Nun kriege ich einen Error(LNK2005 unter Visual C++ 2012 Express) und wenn ich den ignoriere gibt funktionA bei Objekten der Klasse B und der Klasse C drei aus.
    Ist es nicht möglich, dass so zu trennen, dass die Funktionen etwas unterschiedliches ausgeben. Wäre mir wichtig, weil ich dann eine list<A> machen kann, dann B oder C in diese Liste laden kann und dann die überschriebene Funktion aufrufen.
    Hoffe ihr versteht, was ich meine, wenn nicht gebe ich euch morgen Souce Code.
    Danke im voraus



  • Poste einmal ein Minimalbeispiel, bei dem der Fehler auftritt. Ohne Code ist es generell schwierig zu helfen.



  • Ok:

    main.cpp:

    #include "stdafx.h"
    #include "B.h"
    #include "C.h"
    
    B b;
    C c;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	b.FunktionA();
    	c.FunktionA();
    	system("PAUSE");
    	return 0;
    }
    

    A.h:

    #pragma once
    class A
    {
    public:
    	void FunktionA();
    };
    

    B.h:

    #pragma once
    #include "A.h"
    #include<iostream>
    
    class B : public A {
    public:
    	B(void);
    	~B(void);
    };
    

    B.cpp:

    #include "stdafx.h"
    #include "B.h"
    
    B::B(void) {}
    
    B::~B(void) {}
    
    void A::FunktionA() {
    	std::cout << "B" << std::endl;
    }
    

    C.h:

    #pragma once
    #include "A.h"
    #include<iostream>
    
    class C : public A {
    public:
    	C(void);
    	~C(void);
    };
    

    C.cpp:

    #include "stdafx.h"
    #include "C.h"
    
    C::C(void) {}
    
    C::~C(void) {}
    
    void A::FunktionA() {
    	std::cout << "C" << std::endl;
    }
    

    Output sollte B C sein.
    Stattdessen gibt es den Fehler:
    Fehler 1 error LNK2005: "public: void __thiscall A::FunktionA(void)" (?FunktionA@A@@QAEXXZ) ist bereits in B.obj definiert. c:\Users\PC\documents\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\C.obj ConsoleApplication1

    und wenn ich ihn ignoriere ist der Output C C.
    Hoffe mein Problem ist jetzt verständlicher.
    Mfg



  • Du überschreibst nirgendswo die FunktionA aus A.
    Stattdessen definierst du sie zweimal, einmal in B.cpp und einmal in C.cpp.
    Lies noch einmal in einem Grundlagenbuch nach, wie das mit virtuellen Methoden und so geht.
    Und nutz keine globalen Variablen!



  • Lies in deinem Buch einfach das Kapitel zuende.

    Du kannst Funktionen mit virtual überschreibbar machen. Wenn du sie überschreibst, musst du aber wieder virtual verwenden.



  • Marthog schrieb:

    Wenn du sie überschreibst, musst du aber wieder virtual verwenden.

    nein muss man nicht. http://ideone.com/sPdkKe



  • Danke euch allen, für diese tolle Hilfe. Jetzt habe ich verstanden wie das funktioniert!



  • Wenn du eine Funktion überschreiben willst und einen C++11-fähigen Compiler hast, solltest du override dahinter schreiben. Damit merkst du, ob es funktioniert hat.



  • firefly schrieb:

    nein muss man nicht. http://ideone.com/sPdkKe

    Ah, danke. Wieder was neues gelernt.


Anmelden zum Antworten