Vererbung - Beste Möglichkeit konstante Eigenschaft zuzuweisen



  • Hallo.

    Ich sehe zwei Möglichkeiten einer Unterklasse eine (konstante) Eigenschaft zu geben:

    Hier ein Beispiel das meine Frage verdeutlicht:

    1. Möglichkeit:

    class Basis {
    public:
    	const char typ;
    	Basis(char _typ = 0) : typ(_typ) {}; // typ wird auf 0 gesetzt
    // ...
    }
    
    class Kind {
    public:
    	Kind() : Basis(1) {}; // typ wird auf 1 gesetzt
    // ...
    

    Den Typen erhält man nun per kindObjekt.typ

    Die alternative dazu wäre Folgendes (2. Möglichkeit):

    class Basis {
    public:
    	virtual char typ() { return 0; };
    // ...
    }
    
    class Kind {
    public:
    	virtual char typ() { return 1; };
    // ...
    

    Hier erhält man den Typen über kindObjekt.typ().

    Also: Konstante Vorbelegung in der Basisklasse gegen virtuelle Funktion.
    Was ist a) sauberer?
    Und was ist b) schneller?

    Danke!



  • Wenn das konstante Attribut eine Eigenschaft der Basisklasse ist, warum nicht dort deklarieren? Du hast damit den Overhead der VTable nicht, was schneller ist und weniger Speicher benötigt.

    Ausserdem würde ich von konstanten Membern absehen, nur weil sich der Wert nicht verändern kann. Du nimmst damit einige Einschränkungen in Kauf (kein sinnvoller operator= möglich, keine Wertsemantik, keine Speicherung in STL-Containern). Verzichte lieber auf öffentliche Set-Methoden, wenn das Attribut von aussen nicht modifiziert werden soll.



  • Nexus schrieb:

    Wenn das konstante Attribut eine Eigenschaft der Basisklasse ist, warum nicht dort deklarieren? Du hast damit den Overhead der VTable nicht, was schneller ist und weniger Speicher benötigt.

    Danke. Hat mir weitergeholfen, habe mich jetzt für Möglichkeit 1 entschieden.
    Ich wusste gar nicht wie das vorher umgesetzt wird (für andere mit dem gleiche Problem: VTable).

    Ausserdem würde ich von konstanten Membern absehen, [...]

    Ist in diesem Fall egal. Alle erzeugten Objekte sind konstant und sollen sich nicht anders zuweisen lassen.

    Danke + Gruß!


Anmelden zum Antworten