Czy można polimorficznie korzystać z przeładowanego operatora <<. Jeśli tak to prosiłbym o jakiś przykład bo próbuję Visual nie kompiluje.
e... jeśli dobrze kojarzę, to przeładowania operatorów nie są dziedziczone, nie uda się ich tez więc zwirtualizować. Mogę sie mylić, ale wydaje mi się, że tak właśnie jest.
tak jest, możesz to zaobserować choćby próbując odziedziczyć iostream ;]
omg.. ludzie.. operatory sa w dwoch rodzajach.. albo "zewnetrzne", albo "wewnetrzne"..
"zewnetrzne":
ostream& operator + (ostream&, Klasa);
nie sa dziedziczone, poniewaz to sa ZWYKLE LUZNO LATAJACE FUNKCJE
"wewnetrzne":
string& string::operator + (string const &);
SA dziedziczone, poniewaz to sa ZWYKLE METODY
a co do wirtualnosci/polimorfizmu to chyba oczywiste ze dziala tylko w przypadku metod..
#include <iostream>
struct A
{
virtual int operator+(int){return 1;}
virtual int operator=(int){return 5;}
};
struct B : public A
{
virtual int operator+(int){return 2;}
virtual int operator=(int){return 6;}
};
struct C
{
};
struct D : public C
{
};
struct E : public C
{
};
int operator+(C&,int){return 3;}
int operator+(D&,int){return 4;}
int main()
{
A a;B b;C c;D d;E e;
A* a1 = &a;
A* a2 = &b;
C* c1 = &c;
C* c2 = &d;
std::cout << (*a1)+1 << std::endl;
std::cout << (*a2)+1 << std::endl; //co dowodzi poprawnego dziedziczenia i wywolan witualnych
std::cout << (*c1)+1 << std::endl;
std::cout << (*c2)+1 << std::endl;
std::cout << e+1 << std::endl; //co dowodzi poprawnego dziedziczenia i autorzutowania w gore
std::cout << ((*a1)=1) << std::endl;
std::cout << ((*a2)=1) << std::endl; //wirtualny operator =
}
quetzalcoatl napisał(a)
omg.. ludzie.. operatory sa w dwoch rodzajach.. albo "zewnetrzne", albo "wewnetrzne"..
"wewnetrzne":
string& string::operator = (string const &);
SA dziedziczone, poniewaz to sa ZWYKLE METODY
Nie jt to prawda: operator=() nie jest dziedziczony!
quetzalcoatl napisał(a)
omg.. ludzie.. operatory sa w dwoch rodzajach.. albo "zewnetrzne", albo "wewnetrzne"..
Wiem o tym, ale rozmiawiamy przecież o operator<< który w ogóle nie może być składową klasy
Akrobatyczny Wojtek napisał(a)
quetzalcoatl napisał(a)
omg.. ludzie.. operatory sa w dwoch rodzajach.. albo "zewnetrzne", albo "wewnetrzne"..
"wewnetrzne":
string& string::operator = (string const &);
SA dziedziczone, poniewaz to sa ZWYKLE METODYNie jt to prawda: operator=() nie jest dziedziczony!
Wiem o tym, ale rozmiawiamy przecież o operator<< który w ogóle nie może być składową klasy
W takim razie mogles sie bardziej postarac z tym przykladem.
sprzedamsanki napisał(a)
quetzalcoatl napisał(a)
omg.. ludzie.. operatory sa w dwoch rodzajach.. albo "zewnetrzne", albo "wewnetrzne"..
Wiem o tym, ale rozmiawiamy przecież o operator<< który w ogóle nie może być składową klasy
"prawostronny" moze byc i jest, "lewostronny" - nie moze. por.:
cout << X; //funkcja operator>>(ostream, X)
X >> cout; //metoda klasy X::operator>>(ostream)
cin >> X; //funkcja jw.
X << cin; //metoda klasy jw.
tak wiec to tylko kwestia wyboru pomiedzy zewnetrznym i wewnetrznym i tego, czy wolimy zachowac latwa rozszerzalnosc (zewnetrzne mozna zawsze dopisac nowe), czy raczej zamykac wszystko w klasach (wewnetrzne sa ladniejsze, ale dodanie nowego kosztuje edycje klasy)
Akrobatyczny Wojtek napisał(a)
quetzalcoatl napisał(a)
omg.. ludzie.. operatory sa w dwoch rodzajach.. albo "zewnetrzne", albo "wewnetrzne"..
"wewnetrzne":
string& string::operator = (string const &);
SA dziedziczone, poniewaz to sa ZWYKLE METODYNie jt to prawda: operator=() nie jest dziedziczony!
dziedziczony, rzeczywiscie, nie jest, ale wywolania wirtualne na nim dzialaja tak samo.. jednak zeby nie bylo watpliwosci, poprawilem przyklad