Problem z dziedziczeniem konstruktora

0

Mam pytanie w sprawie dziedziczenia konstruktora, potrzebuje żeby konstruktor wyświetlał linijke tekstu, ale przy tworzeniu obiektu dynamicznie wyświetla sie tez tekst konstruktora z klasy Okrag.
Jakieś pomysły jak to zrobić żeby wyświetlił sie sam konstruktor klasy Kolo?

class Okrag
{
public:
    Okrag()
    {
    cout << "-----Tworze Okrag-----" << endl;
    }
};

class Kolo : public Okrag
{
public:
    Kolo()
    {
    cout << "-----Tworze Kolo-----" << endl;
    }

};


int main()
{
Kolo *k;
k = new Kolo();
}
0

Jeśli chcesz, żeby został wykonany konstruktor klasy z której dziedziczysz, musisz wywołać go jawnie w kodzie, przez listę inicjalizacyjną. Jakoś tak

class Kolo : public Okrag
{
public:
    Kolo() : Okrag()
    {
    cout << "-----Tworze Kolo-----" << endl;
    }

};
3

Możesz sobie w rodzicu zrobić drugi, cichy konstruktor i jawnie go wywołać w konstruktorze potomka.

struct SilentTag{};

class Okrag {
public:
    Okrag() {
        cout << "-----Tworze Okrag-----" << endl;
    }
    Okrag(SilentTag) {
    }
};

class Kolo : public Okrag {
public:
    Kolo(): Okrag(SilentTag{}) {
        cout << "-----Tworze Kolo-----" << endl;
    }
};

Brak komunikatu może też być parametrem rodzica, jeżeli będzie miał wartość domyślną, to dalej będzie to konstruktor domyślny:

class Okrag {
public:
    Okrag(bool silent=false) {
        if(!silent) {
            cout << "-----Tworze Okrag-----" << endl;
        }
    }
};

class Kolo : public Okrag {
public:
    Kolo(): Okrag(true) {
        cout << "-----Tworze Kolo-----" << endl;
    }
};
5

Co do dziedziczenia jako takiego ...

Dziedziczenie to relacja "jest", czyli jabłko JEST owocem, to na pewno.
Ale czy Koło jest Okregiem ??? Miałbym wątpliwości. Powiedziałbym, że koło POSIADA Okrąg jako swój obwód, tam mi się matematycznie wydaje.

Jest wiele, wiele materiałów edukacyjnych, które przeceniają dziedziczenie, i uczą go błędnie. Przemyśl JEST vs POSIADA, czyli dziedziczenie vs kompozycja

3
ZrobieDobrze napisał(a):

Co do dziedziczenia jako takiego ...

Dziedziczenie to relacja "jest", czyli jabłko JEST owocem, to na pewno.
Ale czy Koło jest Okregiem ??? Miałbym wątpliwości. Powiedziałbym, że koło POSIADA Okrąg jako swój obwód, tam mi się matematycznie wydaje.

Jest wiele, wiele materiałów edukacyjnych, które przeceniają dziedziczenie, i uczą go błędnie. Przemyśl JEST vs POSIADA, czyli dziedziczenie vs kompozycja

To są bajeczki. Nie ma żadnej z tych relacji w programowaniu, is-a, has-a, contains-a, etc.

Kompozycja/agregacja/asocjacja to po prostu sposoby modularyzacji i kontroli współpracy obiektów, a dziedziczenie to nic innego jak redeklaracja funkcji i pól i innych elementów w pod-zakresie (z parenta do dziecka).

Próbowanie wpaswania tych elementów w takie nazwane relacje jak is-a, has-a,jest bezowocne i w gruncie rzeczy bezsensowne.

Jabłko jest owocem, ale klasa jabłko nie jest klasą owoc. Koło jest okręgiem (może, może nie), ale klasa koło na pewno nie jest klasą okrąg.

1

Cytując/Parafrazując Wujka Boba:

Klasy są reprezentacją rzeczywistości, ale reprezentacje rzeczy nie współdzielą relacji między rzeczami które są reprezentowane. Przykładowo jak ludzie się rozwodzą i przed sądem są reprezentowani przez prawników, którzy sami się nie rozwodzą.

1

wywołaj w Kole dla Okregu nny konstruktor niz domyślny

class Okrag
{
public:
    Okrag(bool pisz=1)
    {
        if (pisz)
    cout << "-----Tworze Okrag-----" << endl;
    }
};

class Kolo : public Okrag
{
public:
    Kolo():Okrag(0)
    {
    cout << "-----Tworze Kolo-----" << endl;
    }

};


int main()
{
Kolo *k;
k = new Kolo();
}

0

dzieki za pomoc, juz rozumiem

1 użytkowników online, w tym zalogowanych: 0, gości: 1