Ir ao conteúdo
  • Cadastre-se

C++ Herança e Poliformismo em C++


PC Trindade

Posts recomendados

image.png.ee02a1486f6f62b36646f5242c0f5a39.png

 

Para Main, em baixo;

Int main()

{

Vector<Car *> cars;

cars.push_back(new PassengerCar(382, 41245, 4, 0));

cars.push_back(new Truck(450, 50000, "Soy", 8));

 

carr[0]->status();

carr[0]->load(2);

carr[0]->load(3);

carr[0]->status();

carr[0]->unload(1);

carr[0]->unload(2);

carr[0]->status();

cout<<endl;

carr[1]->status();

carr[1]->load(0);

carr[1]->status();

carr[1]->unload(0)

carr[1]->status();

cout<<endl;

cars[1]->status();

 

return 0;

 

Obrigado!!!

 

 

 

Link para o comentário
Compartilhar em outros sites

O que é esse código?

 

Qual o sentido de load() e unload()? É para simular algum tipo de carga? Seria um método do vetor e não do carro?

 

Não se escreve isso assim. 

 

Um simples diagrama não indica se a classe é abstraa. A bem da verdade não há isso em C++. O que você faz para forçar algo assim é trivial: apenas declare os métodos como puros. No popular = 0

Link para o comentário
Compartilhar em outros sites

@PC Trindade entendo. Mas o que signiica na prática? O que essas funções vão fazer?

E esse código postado? Que significa? Nem parece C++ mas qual o propósito por exemplo de load(2), load(3)?

 

Não tem nem ao menos uma classe declarada.

 

 

Use o botão code como explicado no primeiro post do forum...

Link para o comentário
Compartilhar em outros sites

Em 29/06/2022 às 21:41, arfneto disse:

A bem da verdade não há isso em C++.

Eu vejo esses diagramas sendo usados mais em Java e C# que são linguagens mais "puramente" orientadas a objeto. Talvez o professor tenha presumido que C++ fosse parecido, pra falar a bem da verdade, para quem é novo em C++ a primeira impressão que dá é que a única diferença deste pro C# é que o C# tem o tal do Garbage Collector em que o programador não precisa ficar desalocando a memória em certas situações. Mas na prática, pelo que entendi o C++ dá a opção de classes mas não te obriga a usar classes para quase tudo como o Java ou C# fazem.

Link para o comentário
Compartilhar em outros sites

28 minutos atrás, Felipecfk disse:

Eu vejo esses diagramas sendo usados mais em Java e C# que são linguagens mais "puramente" orientadas a objeto. Talvez o professor tenha presumido que C++ fosse parecido, pra falar a bem da verdade, para quem é novo em C++ a primeira impressão que dá é que a única diferença deste pro C# é que o C# tem o tal do Garbage Collector em que o programador não precisa ficar desalocando a memória em certas situações. Mas na prática, pelo que entendi o C++ dá a opção de classes mas não te obriga a usar classes para quase tudo como o Java ou C# fazem.

 

Esses diagramas são clássicos de modelagem de dados desde os anos '80. Tem em toda a literatura.

 

C# é praticamente java sem a VM com o .NET. Mas para os comandos mais simples trechos de C++ até compilam em java. As coleções em java são parecidas com os containers (e nem podia ser diferente na verdade).

 

Mas fora isso as linguagens são muito diferentes. 

Como esses https://pt.wikipedia.org/wiki/Diagrama_de_classes

 

Link para o comentário
Compartilhar em outros sites

#include <iostream>

using namespace std;

class Car{
    double Power;   //força
    double price;   //Preço
    unsigned number_of_cars;    //nº de Carros

public:
    Car(double Power, double price, unsigned number_of_cars){}
    virtual ~Car(){
        cout<<"\n Destrutor executado" ;
        }
    void setPower(double Power;){}
    double getPower(){return Power;}
    void setprice(double price;){}
    double getpreice(){return price;}
    virtual char(status[], load[], unload[])        // fiquei na dúvida se pode?? 
    
};
class PassengerCar: public Car
{
    unsigned MaxPassengers;
    unsigned Passengers;
public:
    PassengerCar(unsigned MaxPassengers, unsigned Passengers, double Power, double price, unsigned number_of_cars):
        Car(double Power, double price, unsigned number_of_cars){}
    virtual -PassengerCar(){
        cout<<"\n Destrutor executado" ;}
    virtual char(status[], load[], unload[])        // fiquei na dúvida se pode?? 
};
class Truck : public Car
{
    string typeofload;      //tipo de Carga
    bool Loaded;            // Carregado
    unsigned numberofWheels;    // nº de Rodas
    
public:
    Truck(string typeofload, bool Loaded, unsigned numberofWheels, double Power, double price, unsigned number_of_cars):
        Car(double Power, double price, unsigned number_of_cars){}
    virtual ~Truck(){
        cout<<"\n Destrutor executado" ;}
    virtual char(status[], load[], unload[])        // fiquei na dúvida se pode?? 
};

int main()
{
    Vector<Car *> cars;
    cars.push_back(new PassengerCar(382, 41245, 4, 0));
    cars.push_back(new Truck(450, 50000, "Soy", 8));

    carr[0]->status();
    carr[0]->load(2);
    carr[0]->load(3);
    carr[0]->status();
    carr[0]->unload(1);
    carr[0]->unload(2);
    carr[0]->status();
    cout<<endl;
    carr[1]->status();
    carr[1]->load(0);
    carr[1]->status();
    carr[1]->unload(0)
    carr[1]->status();
    cout<<endl;
    cars[1]->status();

    return 0;
}
 

 

è neste formato só que tenho algumas dúvidas

Link para o comentário
Compartilhar em outros sites

Em 30/06/2022 às 20:37, arfneto disse:

Use o botão code como explicado no primeiro post do forum...

 

E como eu disse no post anterior. Veja a diferença:
 

#include <iostream>

using namespace std;

class Car{
    double Power;   //força
    double price;   //Preço
    unsigned number_of_cars;    //nº de Carros

public:
    Car(double Power, double price, unsigned number_of_cars){}
    virtual ~Car(){
        cout<<"\n Destrutor executado" ;
        }
    void setPower(double Power;){}
    double getPower(){return Power;}
    void setprice(double price;){}
    double getpreice(){return price;}
    virtual char(status[], load[], unload[])        // fiquei na dúvida se pode?? 
    
};
class PassengerCar: public Car
{
    unsigned MaxPassengers;
    unsigned Passengers;
public:
    PassengerCar(unsigned MaxPassengers, unsigned Passengers, double Power, double price, unsigned number_of_cars):
        Car(double Power, double price, unsigned number_of_cars){}
    virtual -PassengerCar(){
        cout<<"\n Destrutor executado" ;}
    virtual char(status[], load[], unload[])        // fiquei na dúvida se pode?? 
};
class Truck : public Car
{
    string typeofload;      //tipo de Carga
    bool Loaded;            // Carregado
    unsigned numberofWheels;    // nº de Rodas
    
public:
    Truck(string typeofload, bool Loaded, unsigned numberofWheels, double Power, double price, unsigned number_of_cars):
        Car(double Power, double price, unsigned number_of_cars){}
    virtual ~Truck(){
        cout<<"\n Destrutor executado" ;}
    virtual char(status[], load[], unload[])        // fiquei na dúvida se pode?? 
};

int main()
{
    Vector<Car *> cars;
    cars.push_back(new PassengerCar(382, 41245, 4, 0));
    cars.push_back(new Truck(450, 50000, "Soy", 8));

    carr[0]->status();
    carr[0]->load(2);
    carr[0]->load(3);
    carr[0]->status();
    carr[0]->unload(1);
    carr[0]->unload(2);
    carr[0]->status();
    cout<<endl;
    carr[1]->status();
    carr[1]->load(0);
    carr[1]->status();
    carr[1]->unload(0)
    carr[1]->status();
    cout<<endl;
    cars[1]->status();

    return 0;
}

 

39 minutos atrás, PC Trindade disse:

è neste formato só que tenho algumas dúvidas

 

Não acha que podia listar algumas já é o objetivo desse forum?

 

Acho que já perguntei isso, mas qual o propósito de load / unload? tratar carga nos caminhões e carros? É isso mesmo? 

 

Link para o comentário
Compartilhar em outros sites

Esse problema parece bem besta e mal formulado e não deve ter sido proposto por alguém com experiência nessas coisas.

 

O enunciado fala em load/unload para um vetor de veículos. O que seria isso? inserir e remover valores? Para que criar ambiguidade com os métodos load/unload de Car PassengerCar e Truck? E qual o sentido desses métodos afinal?

 

Não há razão pra usar memória dinâmica e não fica claro onde: o enunciado fala em criar um vetor de veículos mas o "programa" fornecido (imagino que tenha sido fornecido) cria um vetor de ponteiros para a classe base, o que é outra coisa bem diferente. E onde está o delete? E não se sabe há décadas que nem é recomendado usar new em C++? C++11 já é quase adolescente.

 

Exibir o número de carros restantes quando um objeto for destruído é algo estranho, já que o destrutor de Car não deveria ter acesso ao vetor nem a qualquer outra instância da classe ou derivadas. Não faz sentido nessas linguagens.

 

E assim o campo number_of_cars parece bem inútil na classe Car. Deveria estar quem sabe em uma classe Frota que conteria o vetor, certo?

 

 

image.png.2421b5187313a2dbd4f393578cefb72e.png

 

 

 

 

A partir desse folclórico diagrama, Car seria algo como

 

 

class Car
{
   public:
    double   power;
    double   price;
    unsigned number_of_cars;
    Car();
    ~Car();
    void   setPower(double);
    void   setPrice(double);
    void   status();
    void   load();
    void   unload();
    double getPower();
    double getPrice();
};

 

  • A julgar pelo nome das funções set/get --- e isso não é java ---
    • se imagina que power e price devem ser private na classe ou não faria sentido ter esses métodos.
    • number_of_cars deve ser apenas um erro, como eu disse acima. Mas se é verdade então number_of_cars deve ser static. E mesmo assim pouco sentido faria porque
      • o tamanho do vetor de ponteiros daria exatamente esse valor
      • não se sabe ao certo quando e porque inicializar number_of_cars. Por certo não pode ser no construtor de Car. E assim se cria uma fragilidade na classe sem razão: quem vai garantir que esse valor é real? E para que se basta usar cars.size() para ter esse número atualizado?

 

Assim sendo a classe revista seria algo assim

 

class Car
{
   public:
    static unsigned number_of_cars;

   private:
    double power;
    double price;

   public:

    Car();
    ~Car();
    void   setPower(double);
    void   setPrice(double);
    double getPower();
    double getPrice();
    void   status();
    void   load();
    void   unload();
};

 

E para isso ser uma classe abstrata --- não tem classes abstratas em C++ como em java  --- basta declarar ao menos um dos métodos como puros. e considerando os diagramas das classes derivadas:

 

class Car
{
   public:
    static unsigned number_of_cars;

   private:
    double power;
    double price;

   public:
    Car();
    ~Car();
    void   setPower(double);
    void   setPrice(double);
    double getPower();
    double getPrice();
    virtual void   status()         = 0;
    virtual void   load()           = 0;
    virtual void   unload()         = 0;
};

 

Isso serviria para implementar Car inicialmente

 

#include "Car.h"
Car::Car() : power(0.), price(0.)  {}
Car::~Car() {}

void Car::setPower(double p) { power = p; }
void Car::setPrice(double p) { price = p; }

double Car::getPower() { return power; }
double Car::getPrice() { return price; }

 

e isso em main faria algum sentido

 

#include <iostream>
#include <vector>
#include "Car.h"
using namespace std;
int main(void)
{
    std::vector<Car*> cars;
    Car::number_of_cars = 0;
    return 0;
}

 

Essa é uma maneira comum de começar esse exercício, escrevendo em torno dos dados.

 

Isso já compila, embora não faça sentido ainda. E é preciso ter ao menos uma instância de Car para rodar.

 

E é claro que não pode declarar um Car. Porque? Porque Car é oficialmente abstrata.

 

Veja um exemplo de uma tentativa:

 

image.png.6173b6c05ae60f430cc53d895697375d.png

 

mesmo no IDE já aparece a razão. Até aqui então está tudo certo.

image.png

Claro que insistindo em compilar viria algo como

 

error C2259: 'Car': cannot instantiate abstract class

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O meu cód. ficou assim, só que ainda tem alguns problemas, poderiam me ajudar??

Gratos pela ajuda!!





#include <iostream>
#include <vector>
using namespace std;

class Car{
    double Power;   //força
    double Price;   //Preço

public:
    static unsigned number_of_cars;    //nº de Carros
    Car(double power, double price){
        Power = power;
        Price = price;
        number_of_cars++;
    }
    virtual ~Car() {
        number_of_cars--;
        cout<<"\n Destrutor executado" ;
    }
    void setPower(double power){Power=power;}
    double getPower(){return Power;}
    void setPrice(double price){Price = price;}
    double getPrice(){return Price;}
    virtual void status() {
        cout << "Power :: " << getPower() << endl;
        cout << "Price :: " << getPrice() << endl;
    }
    virtual void load() = 0;
    virtual void unload() = 0;

};

unsigned Car::number_of_cars = 0;

class PassengerCar: public Car
{
    unsigned MaxPassengers;
    unsigned passengers;
public:
    PassengerCar(double Power, double Price, unsigned maxPassengers, unsigned Passengers):
        Car( Power, Price){
            MaxPassengers = maxPassengers;
            passengers = Passengers;
        }
    virtual ~PassengerCar(){
        cout<<"\n Destrutor executado" ;
        }
    void status() {
        cout << "PassengerCar" << endl;
        Car::status();
        cout << "MaxPassengers :: " << MaxPassengers << endl;
        cout << "passengers :: " << passengers << endl;
    }
    void load(unsigned number)  {

    }

    void unload(unsigned number) {

    }

};
class Truck : public Car
{
    string typeofload;      //tipo de Carga
    bool Loaded;            // Carregado
    unsigned NumberofWheels;    // nº de Rodas

public:
    Truck(double Power, double Price, string typload, bool loaded, unsigned numberofWheels) :
        Car(Power, Price){
            typeofload = typload;
            Loaded = loaded;
            NumberofWheels = numberofWheels;
     }

    virtual ~Truck(){
        cout<<"\n Destrutor executado" ;
    }

    void status() {

        cout << "Truck" << endl;
        Car::status();
        cout << "typeofload :: " << typeofload << endl;
        cout << "Loaded :: " << Loaded << endl;
    }

    void load (unsigned number) {

    }

    void unload(unsigned number) {

    }
};

int main()
{
    vector<Car *> cars;
    cars.push_back(new PassengerCar(382, 41245, 4, 0));
    cars.push_back(new Truck(450, 50000, "Soy", 8));

    carr[0]->status();
    carr[0]->load(2);
    carr[0]->load(3);
    carr[0]->status();
    carr[0]->unload(1);
    carr[0]->unload(2);
    carr[0]->status();
    cout<<endl;
    carr[1]->status();
    carr[1]->load(0);
    carr[1]->status();
    carr[1]->unload(0)
    carr[1]->status();
    cout<<endl;
    cars[1]->status();

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1- Você digitou carr ao invés de cars, em várias linhas do escopo main()

2- Colocou unsigned e não determinou o tipo da variável, unsigned significa que só aceita valores positivos. Por exemplo a altura de uma pessoa é sempre positiva, nunca negativa. No caso desse exercício é o número de carros e o número de passageiros.

3- Colocou o código sem querer em formatação HTML, fica ruim de ler. Coloca em C/C++, está na parte inferior direita da tela do Code

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#include <iostream>
#include <vector>
using namespace std;

class Car{
    double Power;   //força
    double Price;   //Preço
public:
    static unsigned number_of_cars;    //nº de Carros alocação static
    Car(double power, double price){
        cout << "Construtor Car executado" << endl;
        Power = power;
        Price = price;
        number_of_cars++;
        cout << "Number of Cars :: " << number_of_cars << endl;
    }
    virtual ~Car() {
        number_of_cars--;
        cout << "Destrutor Car executado" << endl;
        cout << "Number of Cars :: " << number_of_cars << endl;
    }
    void setPower(double power){Power=power;}
    double getPower(){return Power;}
    void setPrice(double price){Price = price;}
    double getPrice(){return Price;}
    virtual void status() {
        cout << "Power :: " << getPower() << endl;
        cout << "Price :: " << getPrice() << endl;
    }
    virtual void load(unsigned number) = 0;
    virtual void unload(unsigned number) = 0;
};

unsigned Car::number_of_cars = 0;	// unsigned nº não negativos

class PassengerCar: public Car
{
    unsigned MaxPassengers;
    unsigned Passengers;
public:
    PassengerCar(double power, double price, unsigned maxPassengers, unsigned passengers)
        : Car(power, price) {
        cout << "Construtor PassengerCar executado" << endl;
        MaxPassengers = maxPassengers;
        Passengers = passengers;
    }
    virtual ~PassengerCar(){
        cout << "Destrutor PassengerCar executado" << endl;
    }
    void status() {
        cout << "PassengerCar" << endl;
        Car::status();
        cout << "MaxPassengers :: " << MaxPassengers << endl;
        cout << "Passengers :: " << Passengers << endl;
    }
    void load(unsigned number)  {					//Carregue
        if (Passengers + number > MaxPassengers) {
            cout << "Invalid (overflow)" << endl;
            return;
        }
        Passengers += number;
    }
    void unload(unsigned number) {					//Descarregue
        if (int(Passengers - number) < 0) {
            cout << "Invalid (underflow)" << endl;
            return;
        }
        Passengers -= number;
    }
};
class Truck : public Car
{
    string Typeofload;      //tipo de Carga
    bool Loaded;            // Carregado
    unsigned NumberofWheels;    // nº de Rodas
public:
    Truck(double power, double price, string typeofload, unsigned numberofWheels)
        : Car(power, price) {
        cout << "Construtor Truck executado" << endl;
        Typeofload = typeofload;
        Loaded = false;
        NumberofWheels = numberofWheels;
    }
    virtual ~Truck(){
        cout << "Destrutor Truck executado" << endl;
    }
    void status() {
        cout << "Truck" << endl;
        Car::status();
        cout << "Typeofload :: " << Typeofload << endl;
        cout << "Loaded :: " << Loaded << endl;
        cout << "NumberofWheels :: " << NumberofWheels << endl;
    }
    void load (unsigned number) {
        Loaded = true;
    }
    void unload(unsigned number) {
        Loaded = false;
    }
};

int main()
{
    vector<Car *> cars;
    cars.push_back(new PassengerCar(382, 41245, 4, 0));
    cars.push_back(new Truck(450, 50000, "Soy", 8));

    cars[0]->status();
    cars[0]->load(2);
    cars[0]->load(3);
    cars[0]->status();
    cars[0]->unload(1);
    cars[0]->unload(2);
    cars[0]->status();
    cout<<endl;
    cars[1]->status();
    cars[1]->load(0);
    cars[1]->status();
    cars[1]->unload(0);
    cars[1]->status();
    cout<<endl;
    delete cars[0];
    cars[1]->status();
    return 0;
}


Senhores projeto final.
  Muito obrigado a todos!!

 

Quem Poderia me ajudar nesta outra?

image.png.e2941e5fe34935b54282debada5ab085.png

 

Para Main!!

 

#include <iostream>
#include <vector>
using namespace std;

int main(){
	
	Car BMW(382, 41245);
	Car Ferrari(710, 350000);
	cout<<"BMW: "<<BMW<<endl;
	cout<<"Ferrari: "<<Ferrari<<endl;
	//1-
	cout<<"\n1-\n";
	cout<<"Ferrari-BMW: "<<Ferrari-BMW<<endl;
	cout<<"BMW*Ferrari: "<<BMW*Ferrari<<endl;
	cout<<"Ferrari/BMW: "<<Ferrari/BMW<<endl;
	//2-
	cout<<"\n2-\n";
	BMW+=20;
	cout<<"BMW+=20: "<<BMW<<endl;
	BMW-=20;
	cout<<"BMW-=20: "<<BMW<<endl;
	BMW*=2;
	cout<<"BMW*=2:: "<<BMW<<endl;
	BMW/=2;
	cout<<"BMW/=2:: "<<BMW<<endl;
	//3-
	cout<<"\n3-\n";
	cout<<"++BMW: "<<++BMW<<endl;
	cout<<"--BMW: "<<--BMW<<endl;
	cout<<"BMW++: "<<BMW++<<" BMW later"<<BMW<<endl;
	cout<<"BMW--: "<<BMW--<<" BMW later"<<BMW<<endl;
	//4-
	cout<<"\n4-\n";
	cout<<"BMW==Ferrari?: "<<((BMW==Ferrari()?"TRUE":"FALSE")<<endl;
	cout<<"BMW!=Ferrari?: "<<((BMW!=Ferrari()?"TRUE":"FALSE")<<endl;
	cout<<"BMW<=Ferrari?: "<<((BMW<=Ferrari()?"TRUE":"FALSE")<<endl;
	cout<<"BMW>Ferrari?: "<<((BMW>Ferrari()?"TRUE":"FALSE")<<endl;
	return 0;
	
}

 

 

Desde já agradeço!!!

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!