Как вы можете видеть, в обоих случаях вызывается только перегруженная версия оператора вставки потока для базового класса. Я понимаю, почему это так. Это связано с тем, что динамическая привязка отсутствует. Но как я могу это исправить?Оператор потоковой передачи и перегрузки
#include <iostream>
using namespace std;
class A {
int i;
char c;
public:
A(int i = 0, char c = ' ') {
this->i = i;
this->c = c;
}
int getI() { return i; }
char getC() { return c; }
friend ostream& operator << (ostream&, A&);
};
class B : public A {
double d;
public:
B(int i = 0, char c = ' ', double d = 0.0) : A(i, c), d(d) {}
friend ostream& operator << (ostream&, B&);
};
ostream& operator << (ostream& out, A& a) {
out << "\nInteger: " << a.i << "\nCharacter: " << a.c << endl;
return out;
}
ostream& operator << (ostream& out, B& b) {
out << "\nInteger: " << b.getI() << "\nCharacter: " << b.getC() << "\nDouble: " << b.d << endl;
return out;
}
int main() {
A* a = new A (10, 'x');
B* b = new B(20, 'y', 5.23);
A* array[] = { a, b };
cout << *(array[0]);
cout << "\n______________________________\n";
cout << *(array[1]);
delete a;
delete b;
cin.get();
return 0;
}
Как я могу сделать cout << *(array[1]);
вызов перегруженной поток вставки оператора, который принимает объект B, как один из его аргументов?
Прочитайте это: [«Что такое срез объектов?»] (Https://stackoverflow.com/questions/274626/what-is-object-slicing). Затем посмотрите, как вы '' 'массив страдает от того, что описано в вопросе и ответах. – WhozCraig
@WhozCraig Не будет нарезки, объекты передаются по ссылке. – phantom
@Phantom посмотрите на объявление 'array'. Вы не можете иметь массивы родных ссылок. Это простой массив из 'A'. Инициализатор с использованием 'b' (' array [1] ') нарезается. – WhozCraig