Konstruktor vererben?



  • Hallo.

    Ich beschäftige mich z.Z. mit Vererbung, was auch länger schon fällig war.
    Bei einem Testprogramm habe ich mich etwas gewundert, dass ein Konstruktor mit Paramtern nicht vererbt wird, einer ohne aber anscheiend schon.

    #include <iostream>
    
    class A
    {
    private:
        int m_a;
    public:
        A(int a, int b) {m_a = a+b;}
        void set_a(int a) {m_a = a;}
        void show_a() {std::cout << m_a << '\n';}
    };
    
    class B : public A
    {
    };
    
    int main()
    {
        B b(100, 200);
        b.show_a();
    
        getchar();
    
        return 0;
    }
    

    Hier meldet er, dass B::B keine zwei Paramter erlaubt, klar, es gibt ja nur die Standard-ctors und keiner akzeptiert 2 Paramter.

    #include <iostream>
    
    class A
    {
    private:
        int m_a;
    public:
        A() {m_a = 100;}
        void set_a(int a) {m_a = a;}
        void show_a() {std::cout << m_a << '\n';}
    };
    
    class B : public A
    {
    };
    
    int main()
    {
        B b;
        b.show_a();
    
        getchar();
    
        return 0;
    }
    

    Hier hingegen ruft er aber den ctor von A auf und nicht den Standard-ctor von B.

    #include <iostream>
    
    class A
    {
    private:
        int m_a;
    public:
        void set_a(int a) {m_a = a;}
        void show_a() {std::cout << m_a << '\n';}
    };
    
    class B : public A
    {
    };
    
    int main()
    {
        B b;
        b.set_a(100);
        b.show_a();
    
        getchar();
    
        return 0;
    }
    

    Klappt auch vorzüglich, m_a wird fein gefüllt.

    Fragen:

    Also ich möchte jetzt gerne den ctor vererbt haben, bzw. der soll aufgerufen werden, wenn ich die Klasse b erstelle und das auch mit Paramtern.
    Geht es auch ohne, dass ich einen ctor in B erstelle, der den ctor von A aufruft?
    Wenn ja, wie? 🙂

    Ist es möglich explizit bei dem Erstellen einer Klasse zu sagen, dass ein bestimmter Konstruktor aufgerufen werden soll, wie es auch bei normalen Funktionen möglich ist?

    class A
    {
    protected:
    int m_a;
    public:
    void set_a(int a) {m_a = a;}
    }
    
    class B : A
    {
    public:
    void set_a(int a) {m_a = a*2;}
    }
    
    int main()
    {
    B b;
    b.A::set_a(100);
    return 0;
    }
    

    Geht das iorgendwie auch mit ctors? 😕

    Noch eine Design-Frage:
    Ich möchte gerne für jede abgeleitete Klasse verschiedene konstante Elemente haben.
    Also in jeder abgeleiteten Klasse gibt es die Elemente speed, might, etc. die aber konstant sind.
    Und die Werte sind je von Klasse zu Klasse verschieden.
    Konstant bedeutet hier natürlich, dass alle Klasseninstanzen der abgeleiteten Klasse dieselben Elemente haben, und dass die Werte nicht verändert werden können, aber wie kann ich in der Basisklasse klarmachen, dass die Elemente in jeder abgeleiteten Klasse da sind aber je nach Klasse verschieden und außerdem konstant, sodass die Instanz den jeweiligen Wert nicht ändern kann.
    😕

    Danke im Voraus. 🙂

    MfG MAV

    [ Dieser Beitrag wurde am 04.05.2003 um 19:02 Uhr von Mis2com editiert. ]



  • Ich habe deinen Thread nur mit einem Auge überflogen, jedoch wird ein Konstruktor nie Vererbt. Wenn du einen Parameter dem Konstruktor einer abgeleiteten Klasse übergeben willst, kannst du dies nur Über eine Konstruktorliste tun. Die wird von hinten nach vorne aufgerufen.



  • hier ein codebeispiel (getestet):

    #include <iostream>
    
    using namespace std;
    
    class Demo 
    {
    
        public:
            Demo (int bla)
            {
                cout << "Demo" << endl;
    
            }
        private:
        protected:
    
    };
    
    class Noname
    {
    
    public:
    
        Noname (int bla)
        {
            cout << "Noname" << endl;
    
        }
    private:
    protected:
    };
    
    class Tralla : public Demo, Noname 
    {
        public:
            Tralla (int bla) : Demo (bla), Noname (bla)
            {
                cout << "Tralla" << endl;
    
            }
    
        private:
        protected:
    
    };
    
    void main ()
    {
    
        Tralla myTralla (9) ;
        getchar ();
    
    }
    


  • Hallo,

    Danke für die schnelle Antwort. 🙂
    OK, dann muss ich das also über interne Aufrufe regeln, alles klar.

    Die zweite Frage hat sich damit auch erübrigt.

    Aber die dritte wäre noch zu beantworten. 🙂

    Editiert:
    4)

    Hat sich erübrigt...

    MfG MAV

    [ Dieser Beitrag wurde am 04.05.2003 um 19:28 Uhr von Mis2com editiert. ]



  • Hallo,

    hier die rage nochmal im Vordergrund ist sicher net schwer, hält mich aber sehr auf, weil ich nicht weiß, wie ich das realöisieren kann:

    Ich möchte gerne für jede abgeleitete Klasse verschiedene konstante Elemente haben.
    Also in jeder abgeleiteten Klasse gibt es die Elemente speed, might, etc. die aber konstant sind.
    Und die Werte sind je von Klasse zu Klasse verschieden.
    Konstant bedeutet hier natürlich, dass alle Klasseninstanzen der abgeleiteten Klasse dieselben Elemente haben, und dass die Werte nicht verändert werden können, aber wie kann ich in der Basisklasse klarmachen, dass die Elemente in jeder abgeleiteten Klasse da sind aber je nach Klasse verschieden und außerdem konstant, sodass die Instanz den jeweiligen Wert nicht ändern kann.

    MfG MAV



  • Original erstellt von Mis2com:
    **... aber wie kann ich in der Basisklasse klarmachen, dass die Elemente in jeder abgeleiteten Klasse da sind aber je nach Klasse verschieden und außerdem konstant, sodass die Instanz den jeweiligen Wert nicht ändern kann.
    **

    Variablen sind nicht virtuell, dafür aber Funktionen. Einer der Gründe wieso man get/set-Methoden macht.

    class Auto {
    virtual int speed() = 0;
    };

    class Golf : public Auto {
    virtual int speed() const { return 180; }
    };



  • normalerweise sollte eine basisklasse sich niemals gedanken über ihre kindklassen machen, sie soll ihnen nur alles mögliche vorschreiben, anbieten, aber selbst nicht von ihnen abhängig sein.

    du könntest eine referenz od. einen zeiger auf die elemente dem konstruktor der basisklasse übergeben



  • Danke für eure Antworten erstmal.

    @DrGreenThumb:
    Das sieht interessant aus...
    So könnte ich es gut machen, aber ist das nicht irgendwie... scheiße?

    Nagut, also die Frage ist jetzt: In jeder Klasse eine konstante Variable machen, oder eine virtuelle Funktion für die Basisklasse mit üblicher Sache?

    MfG MAV

    [ Dieser Beitrag wurde am 04.05.2003 um 19:59 Uhr von Mis2com editiert. ]



  • Original erstellt von Mis2com:
    **Danke für eure Antworten erstmal.

    @DrGreenThumb:
    Das sieht interessant aus...
    So könnte ich es gut machen, aber ist das nicht irgendwie... scheiße?

    MfG MAV**

    Nö, wieso sollte das scheisse sein?
    Dafür hat man doch Vererbung.

    [ Dieser Beitrag wurde am 04.05.2003 um 19:58 Uhr von DrGreenthumb editiert. ]



  • Naja, aber die konstante Variable wird sowieso nur intern genutzt und ist doch irgendwie blödsinnig, dann eine Funktion zu schreiben ein direkter Zugriff über eine konstante Variable sollte auch schneller sein, als so ein umständlicher Weg extra über eine Funktion, oder?
    Und das scheint mir kein schöner Stil, ist eine konstante Variable anstelle so einer Funktion für jede abgeleitete Klasse dann nicht besser? 😕
    Erscheint mir jedenfalls schöner, oder?

    Nagut, eine Funktion ist besser, weil man da mehr einsehen kann, aber ist die nicht langsamer als der normale Zugriff?
    Besonders wenn man dann eine dynamische Bindung statt einer statischen hat!

    MfG MAV

    [ Dieser Beitrag wurde am 04.05.2003 um 20:05 Uhr von Mis2com editiert. ]


Anmelden zum Antworten