Funkcja Wirtualna

0

Napisz klasę Engine, w której zdefiniujesz:

prywatne pole name;
publiczny konstruktor przyjmujący jeden parametr i ustawiający pole name;
publiczny akcesor i modyfikator do pola name;
publiczną czysto wirtualną metodę turn_on;
publiczną czysto wirtualną metodę turn_off.
Napisz klasy CombustionEngine i ElectricEngine dziedziczące po klasie Engine.

Napisz klasę HybridEngine korzystającą z CombustionEngine i ElectricEngine.

#include <iostream>

using namespace std;

class Engine
{
	private:
	string name ,model;
	
	public:
		Engine(string nazwa="domyslny"){
		name = nazwa;
					
		}
	virtual void turn_on() = 0;
	virtual void turn_off() = 0;
	void change_name(string nazwa , string mod) 
	{
		name=nazwa;
		mod=model;
	
	}
	string get_name()
	{
		return this->name;
	}

	
};

	class CombustionEngine : public Engine
	{
		public:
	
		virtual void turn_on() override
		{
			cout<<" Turn on Combustion Engine ! ";
		}
	};
	
	
	class ElectricEngine : public Engine
	{
		
		public:
		
		virtual void turn_off()override{
			cout<<" Turn off Electric Engine ;( ";
		}
			};
	class HybridEngine : public ElectricEngine, public CombustionEngine
	{
		
		public:
			
		virtual void turn_off() override
		{
			cout<<"Wylaczono hybrydowy silnik";
		}
		
	};
	
	int main()
	{
		Engine *e;
	
	}

*** mam problem z przeciążeniem funkcji nie wiem jak to zrobić. W main pokazuje mi bład.

1
  1. Jeżeli w klasie Engine masz czysto wirtualne funkcje turn_off i turn_on to musisz je zaimplementować w klasach pochodnych.
  2. Brakuje konstruktorów ustawiających wartość pola nazwa dla klas pochodnych.
  3. W klasie HybridEngine użyj dziedziczenia wirtualnego aby uniknąć tzw. diamond problem
  4. W funkcjach z override nie musisz używać słowa virtual
  5. Funkcje zwracające wartość ( np. get_name ) powinny mieć const wstawione po ich nazwie, tak aby można je było także używać w przypadku stałych obiektów.
0

Wniosłem kilka zmian , nie wiem za bardzo o co chodzi z 3 (diamond problem_ jak go uniknąć ?

#include <iostream>

using namespace std;

class Engine
{
	private:
	string name ,model;
	
	public:
		Engine(string nazwa="domyslny"){
		name = nazwa;
					
		}
	virtual void turn_on() = 0;
	virtual void turn_off() = 0;
	void change_name(string nazwa , string mod) 
	{
		name=nazwa;
		mod=model;
	
	}
	string get_name() const
	{
		return this->name;
	}

	
};

	class CombustionEngine : public Engine
	{
		public:
	
		 void turn_on() override
		{
			cout<<this->get_name()<<" Turn on Combustion Engine ! ";
		}
		 void turn_off() override{}
	};
	
	
	class ElectricEngine : public Engine
	{
		
		public:
		
		virtual void turn_off()override{
			cout<<this->get_name()<<" Turn off Electric Engine ;( ";
		}
		
		void turn_on() override{}
			};
	class HybridEngine : public ElectricEngine, public CombustionEngine
	{
		
		public:
			
		 void turn_off() override
		{
			cout<<"Wylaczono hybrydowy silnik";
		}
		void turn_on() override{}
	};
1

nie wiem za bardzo o co chodzi z 3 (diamond problem_ jak go uniknąć ?

Użyj dziedziczenia wirtualnego, czyli

 class HybridEngine : virtual public ElectricEngine, virtual public CombustionEngine
 {
   //...........
 };
0

Program już działa. Dzięki za konkretną odpowiedź. Wdrożyłem również zmiany powyżej

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