// ************************************************ // Métodos "virtual" / Polimorfismo // // ************************************************ #include using std::cout; using std::cin; using std::string; #include using std::list; // =========================================== class Ponto{ int x,y; public: Ponto(); Ponto(int x, int y); void Set(int x, int y); virtual void Imprime(); // metodo virtual }; Ponto::Ponto() { x = y = 0; cout << "PONTO: Construtora SEM parâmetros\n"; } Ponto::Ponto(int x, int y) { this->x = x; this->y = y; cout << "PONTO: Construtora COM parâmetros: " << x << ", " << y << "\n"; } void Ponto::Set(int x, int y) { cout << "PONTO: Set :" << x << ", " << y << "\n"; } void Ponto::Imprime() { cout << "Imprime da PONTO: (" << x << "," << y << ")\n"; } // =========================================== class Circulo: public Ponto{ private: int raio; public: Circulo(); Circulo(int x, int y, int Raio); void Set(int x, int y); void Imprime(); int getRaio(); int a; }; Circulo::Circulo(int a, int b, int r) :Ponto (a,b) { cout << "CIRCULO: Construtora COM parâmetros\n"; raio = r; this->a = a; } Circulo::Circulo() //:Ponto () // se não colocar isto a contrutora da // Circulo chama a mesma contrutora da Ponto, // de qq forma { raio = 0; cout << "CIRCULO: Construtora SEM parâmetros\n"; } void Circulo::Set(int x, int y) { Ponto::Set(x,y); cout << "CIRCULO: Set\n"; } // // Se a "Imprime" da círculo não existir, então, // vai chamar a "Imprime" da classe Base que é a // ponto void Circulo::Imprime() { //Ponto::Imprime(); cout << "CIRCULO: Imprime:\nRaio: " << raio << "\n"; } int Circulo::getRaio() { return raio; } // =========================================== // sobrecarga de operadores para a classe "cpessoa" bool operator >(Circulo &c1, Circulo &c2) { return c1.getRaio() > c2.getRaio(); } float operator +(Circulo &c1, Circulo &c2) { return c1.getRaio()*c1.getRaio() + c2.getRaio()*c2.getRaio(); } int main() { Circulo *C; Ponto *P; list lista; list::iterator p; // aponta para o inicio da lista p = lista.begin(); // insere 2 objeto da classe CIRCULO na lista de objetos PONTO C = new Circulo (111,444,555); lista.push_back(C); C = new Circulo (222,777,33); lista.push_back(C); cout << "\n\nImpressão da lista :\n"; p = lista.begin(); for (int i=0; iImprime(); // Porque não chama a "Imprime" da Círculo ??? p++; } cout << "\n"; Circulo C1(1,1,10), C2(3,4,5); if (C1 > C2) { cout << " \nA área de C1 'é maior que a de C2\n"; } cout << "Valor da soma: " << (C1 + C2) << "\n"; system("PAUSE"); return 0; }