virtualnie przeładowany operator <<

0

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.

0

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.

0

tak jest, możesz to zaobserować choćby próbując odziedziczyć iostream ;]

0

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 =
}
0
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!

0
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

0
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 METODY

Nie 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.

0
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 METODY

Nie 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

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