Unterschied rein virtuelle Methode mit =0 zu const=0



  • Hallo,

    ich bin kein Akademiker und auch nur Hobbyprogrammierer und wollte mal die Profis hier zu meiner Unklarheit befragen.

    Ich bin gerade auf zwei unterschiedlich Signaturen von rein virtuellen Methoden gestoßen. Nun will ich in Erfahrung bringen, ob ich den Unterschied der beiden Arten richtig verstanden habe.

    Bei der rein virtuellen Methode mit const=0, darf in einer abgeleiteten Klasse keine Variable der Klasse selbst geändert werden, wenn diese Methode implementiert wird?



  • const hat mit virtual überhaupt nichts zu tun.. such einfach mal nach "c++ const method", da wird dir alles erklärt.



  • Butterbrot schrieb:

    Bei der rein virtuellen Methode mit const=0, darf in einer abgeleiteten Klasse keine Variable der Klasse selbst geändert werden, wenn diese Methode implementiert wird?

    Ja, richtig ~(es sei denn du benutzt Zeiger als Attribute ... oder du castest das const weg)~

    Aber wie cooky schon gesagt hat, hat das const gar nichts mit virtuellen Methoden zu tun - das kannst (bzw. sollst) du bei jeder Methode einer Klasse anwenden, die das Objekt der Klasse nicht aendern soll.



  • Ok danke, damit kann ich was anfangen.



  • Ferris schrieb:

    Ja, richtig ~(es sei denn du benutzt Zeiger als Attribute ... oder du castest das const weg)~

    Oder du hast mutable-Membervariablen in deiner Klasse.



  • Ferris schrieb:

    [Ja, richtig ~(es sei denn du benutzt Zeiger als Attribute ... oder du castest das const weg)~

    Du kannst ein const nicht wegcasten... Wenn du ein wirklich konstantes Objekt hast, erzeugst du dadurch undefiniertes Verhalten!

    http://stackoverflow.com/questions/11457953/const-cast-vs-mutable-any-difference



  • XSpille schrieb:

    Ferris schrieb:

    [Ja, richtig ~(es sei denn du benutzt Zeiger als Attribute ... oder du castest das const weg)~

    Du kannst ein const nicht wegcasten... Wenn du ein wirklich konstantes Objekt hast, erzeugst du dadurch undefiniertes Verhalten!

    http://stackoverflow.com/questions/11457953/const-cast-vs-mutable-any-difference

    Interessant... Danke fuer den Link.

    Das hier funktioniert mit meinem Compiler (MSVC10) auch nicht:

    const int i = 5;
    int& bla = const_cast<int&>(i);
    bla = 1;
    std::cout << i;
    

    Gibt "5" aus, obwohl es "1" ausgeben muesste... Ich nehme an, weil der Compiler hier einfach eine bloesse Textersetzung vornimmt und keinen extra Speicher auf dem Stapel benutzt?

    Jedenfalls ist so ein Fall eher ein Spezialfall; ehrlich gesagt wundert es mich sogar einwenig, dass mein Compiler keine Warnung ausgibt, da sowas ja zur Kompilierzeit erkannt werden kann.



  • Ferris schrieb:

    Gibt "5" aus, obwohl es "1" ausgeben muesste...

    Müsste es eben nicht. Wenn du const bei echten Konstanten wegcastest, hast du UB (Undefined Behavior) -> alles darf passieren -> Bug im Programm.

    Triff nie irgendwelche Annahmen über UB, sonst fliegt dir eines Tages alles um die Ohren.



  • [quote="Ferris"]

    const int i = 5;
    int& bla = const_cast<int&>(i);
    bla = 1;
    std::cout << i;
    

    😃 Mein GCC gibt mir einen Fehler aus, den ich auch nicht nachvollziehen kann:

    int main()
    {
    	const int i = 5;
    	int& bla = const_cast<int&>(i); // [Error] invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
    }
    

    Wieso rvalue of type 'int' ? Ich erstelle doch gar keine temp. Kopie von i, sodern eine Referenz auf i.



  • out schrieb:

    int main()
    {
    	const int i = 5;
    	int& bla = const_cast<int&>(i); // [Error] invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
    }
    

    Wieso rvalue of type 'int' ? Ich erstelle doch gar keine temp. Kopie von i, sodern eine Referenz auf i.

    Schreibs mal mit Zeilenumbruch nach dem Gleichehitszeichen und schau, in welcher Zeile er dann meckert 😉 Der Compiler weiß, dass i nirgendwo geändert werden darf. Statt dafür Speicher zu reservieren kann er also genauso gut überall, wo "i" steht, gleich "5" einsetzen. Und const_cast<int&>(5) ist nunmal Quark 🙂
    Der 4.5.1er GCC meckert da übrigens nicht. Sondern produziert seltsamen Output: http://ideone.com/5wGt6



  • pumuckl schrieb:

    Der 4.5.1er GCC meckert da übrigens nicht.

    Stimmt, wenn C++11 aktiviert ist meckert er, ansonsten nicht.



  • out schrieb:

    pumuckl schrieb:

    Der 4.5.1er GCC meckert da übrigens nicht.

    Stimmt, wenn C++11 aktiviert ist meckert er, ansonsten nicht.

    Nö, siehe Link - dort ist C++11 aktiviert 😉 Hast du ne spätere Version?



  • pumuckl schrieb:

    out schrieb:

    pumuckl schrieb:

    Der 4.5.1er GCC meckert da übrigens nicht.

    Stimmt, wenn C++11 aktiviert ist meckert er, ansonsten nicht.

    Nö, siehe Link - dort ist C++11 aktiviert 😉 Hast du ne spätere Version?

    Ich habe 4.6.1 , und mit diesen Optionen: -std=c++0x -std=gnu++0x -Wc++0x-compat


Log in to reply