Как вызвать переопределенный оператор вставки базовых классов в переопределенной вставке производных классов и добавить дополнительную информацию - PullRequest
0 голосов
/ 11 октября 2019

В моем базовом классе Animal есть оператор вставки переопределения с информацией о местоположении X & Y животного. Производный класс Bird нужно распечатать X & Y & Z, так как он может летать. Я успешно вызвал оператор базовых классов <<, но не могу добавить информацию о местоположении Z, что я здесь не так делаю? </p>

// BASE CLASS OPERATOR
ostream& operator<<(ostream &os, Animal &animal) {
    ostringstream oss;

    oss << "Id: " << animal.Id
        << "\nAge: " << animal.age
        << "\nStatus: " << animal.status
        << "\nLocation: " << animal.locX << ", " << animal.locY;

    os << oss.str();
    return os;
}

// DERIVED CLASS OPERATOR
ostream &operator<<(ostream &os, const Bird bird) {
    const Animal *birdPtr = &bird;
    os << "Bird" << endl; // THIS IS NOT PRINTING
    os << birdPtr;
    os << ", " << bird.locZ; //THIS IS NOT PRINTING

    return os;
}

Фактический результат:

Id: 1
Age: 0
Status: 1
Location: 0, 0

Ожидаемый результатдля птицы:

Bird
Id: 1
Age: 0
Status: 1
Location: 0, 0, 0

1 Ответ

0 голосов
/ 11 октября 2019

Вы не показали, как вы создаете объект Bird и изначально передаете его в operator<<. Но в показанном вами коде есть несколько ошибок:

  • в базе operator<<, параметр Animal передается как ссылка не const. Вместо этого это должна быть ссылка const.

  • в производном operator<<:

    • параметр Bird передаетсязначение не по ссылке const.

    • вы пытаетесь вызвать вашу базу operator<< с помощью указателя const Animal*, но нет перегрузки operator<<, которая требуетconst Animal* указатель в качестве ввода. Однако в классе std:::ostream есть operator<<, который принимает const void* в качестве ввода, и все типы указателей неявно преобразуются в void* (этот оператор просто выводит адрес памяти, на который указывает указатель)). Поскольку ваша базовая operator<< использует ссылку Animal&, вам необходимо передать ей объект Bird как ссылку Animal&, а не как указатель Animal*.

Попробуйте вместо этого:

ostream& operator<<(ostream &os, const Animal &animal) {
    ostringstream oss;

    oss << "Id: " << animal.Id
        << "\nAge: " << animal.age
        << "\nStatus: " << animal.status
        << "\nLocation: " << animal.locX << ", " << animal.locY;

    os << oss.str();
    return os;
}

ostream& operator<<(ostream &os, const Bird &bird) {
    const Animal &birdRef = bird;

    os << "Bird" << endl;
    os << birdRef;
    // alternatively:
    // os << static_cast<const Animal&>(bird);
    os << ", " << bird.locZ;

    return os;
}

Тогда вы можете сделать это:

Bird bird;
...
std::cout << bird;

Live демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...