• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik na klasę bazową a komunikat wypisania klasy pochodnej

Object Storage Arubacloud
0 głosów
432 wizyt
pytanie zadane 14 grudnia 2016 w C i C++ przez programmero Bywalec (2,420 p.)

Witam przychodzę z pytaniem odnośnie dziedziczenia. Czy ktoś może wyjaśnić jak mam rozumieć wskaźnik na klasę bazową? Dlaczego wypisywany jest komunikat klasy bazowej, a nie klasy pochodnej?

#include <iostream>
#include <string>

using namespace std;

/*
* Animal
*/
class Animal {
private:
    string name;
public:
    Animal();
    Animal(string n);
    string getName();
    friend ostream & operator<<(ostream & os, Animal & object);
};

Animal::Animal() : name("Animal") {}
Animal::Animal(string n) : name(n) {}

string Animal::getName() { return name; }

ostream & operator<<(ostream & os, Animal & object) {
    os << "Name: " << object.name << endl;
    return os;
}

/*
* Dog
*/
class Dog : public Animal {
private:
    string type;
public:
    Dog();
    Dog(string n, string t);
    friend ostream & operator<<(ostream & os, Dog & object);
};

Dog::Dog() : Animal("Dog"), type("Normal") {}
Dog::Dog(string n, string t) : Animal(n), type(t) {}

ostream & operator<<(ostream & os, Dog & object) {
    os << "Name: " << object.getName() << endl;
    os << "Type: " << object.type << endl;
    return os;
}

/*
* Main
*/
int main() {

    Animal animal1;
    Dog dog1("Dog", "Special");

    cout << animal1 << endl; // prints default info
    cout << dog1 << endl;    // prints Dog, Special

    // Pointer
    Animal *pointer = &dog1;
    cout << *pointer << endl; // prints Dog (without Special)

    cin.get();
    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 14 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)

Ponieważ przeciążenie operatora tutaj nie jest wirtualne. Zrób wirtualną metodę(np. toString()) i w klasie bazowej tylko zadeklaruj przeciążenie operatora który będzie korzystał z tej wirtualnej metody. Tak właśnie działa słowo virtual.

komentarz 15 grudnia 2016 przez fenq80 Bywalec (2,940 p.)
A czy można zrobić wirtualna funkcje zaprzyjaźniona.  Bo nie wiem jakby to miało wyglądać.
komentarz 15 grudnia 2016 przez programmero Bywalec (2,420 p.)
Mógłbyś pokazać to na prostym przykładzie, bo nie rozumiem koncepcji. Czy mam stworzyć zupełnie nową metodą i zrobić ją wirtualną czy do operatora<< mam dodać słowo virtual?
komentarz 15 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)
Pokażę jak wrócę do domu (za około 4h)
komentarz 15 grudnia 2016 przez programmero Bywalec (2,420 p.)
Dziękuję w takim razie czekam na przykład wyjaśniający :)
komentarz 15 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)

Korzystając z nudnej lekcji:

class A
{
public:
    virtual void f() const { std::cout << "base"; }
};
class B: public A
{
public:
    virtual void f() const { std::cout << "derived"; }
};

std::ostream& operator<<(std::ostream& os, const A& a )
{
     a.f();
     return os;
}

int main()
{
    B b;
    std::cout << b << std::endl;

    return 0;
}

Źródło: LINK dokładnie ten sam problem co twój.

Podobne pytania

0 głosów
2 odpowiedzi 805 wizyt
0 głosów
5 odpowiedzi 1,916 wizyt
0 głosów
2 odpowiedzi 252 wizyt

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...