Предмет: Информатика, автор: taniyham

Вам потрібно розробити систему для обробки музичних композицій різних жанрів та видів: пісні та інструментальні треки.
Для кожної композиції потрібно визначити назву, тривалість та жанр.
Створіть базовий клас Composition, який містить назву, тривалість та методи для виведення інформації про композицію.
Від класу Composition успадкуйте два підкласи: Song (пісня) та InstrumentalTrack (інструментальний трек).
Клас Song має поле genre (жанр) та методи для визначення жанру пісні.
Клас InstrumentalTrack має поле instrument (інструмент) та методи для визначення інструменту у треці.
Реалізуйте методи для виведення інформації про композицію в кожному з підкласів.
Створіть функцію void ProcessComposition(Composition *composition),
яка приймає вказівник на об'єкт класу Composition і використовує оператори static_cast та dynamic_cast для виконання обробки композиції в залежності від її типу.
Створіть декілька об'єктів різних типів композицій, помістіть їх в масив вказівників на базовий клас Composition і викличте функцію ProcessComposition для кожного з них.
НА МОВІ С++

Ответы

Автор ответа: gguketosl
1

Ответ:

#include <iostream>

#include <string>

using namespace std;

class Composition {

protected:

   string title;

   int duration;

public:

   Composition(string title, int duration) : title(title), duration(duration) {}

   virtual void PrintInfo() {

       cout << "Title: " << title << endl;

       cout << "Duration: " << duration << endl;

   }

};

class Song : public Composition {

private:

   string genre;

public:

   Song(string title, int duration, string genre) : Composition(title, duration), genre(genre) {}

   void PrintInfo() override {

       cout << "Title: " << title << endl;

       cout << "Duration: " << duration << endl;

       cout << "Genre: " << genre << endl;

   }

   void SetGenre(string genre) {

       this->genre = genre;

   }

};

class InstrumentalTrack : public Composition {

private:

   string instrument;

public:

   InstrumentalTrack(string title, int duration, string instrument) : Composition(title, duration), instrument(instrument) {}

   void PrintInfo() override {

       cout << "Title: " << title << endl;

       cout << "Duration: " << duration << endl;

       cout << "Instrument: " << instrument << endl;

   }

   void SetInstrument(string instrument) {

       this->instrument = instrument;

   }

};

void ProcessComposition(Composition *composition) {

   cout << "=== Processing composition ===" << endl;

   composition->PrintInfo();

   Song* song_ptr = dynamic_cast<Song*>(composition);

   if (song_ptr) {

       cout << "This is a song." << endl;

       // Perform logic specific to Song.

   }

   else {

       InstrumentalTrack* inst_track_ptr = dynamic_cast<InstrumentalTrack*>(composition);

       if (inst_track_ptr) {

           cout << "This is an instrumental track." << endl;

           // Perform logic specific to InstrumentalTrack.

       }

   }

}

int main() {

   const int NUM_COMPOSITIONS = 3;

   Composition* compositions[NUM_COMPOSITIONS];

   Song song("Bohemian Rhapsody", 367, "Rock");

   InstrumentalTrack inst_track1("Moon River", 160, "Piano");

   InstrumentalTrack inst_track2("Linus and Lucy", 146, "Jazz");

   compositions[0] = &song;

   compositions[1] = &inst_track1;

   compositions[2] = &inst_track2;

   for (int i = 0; i < NUM_COMPOSITIONS; i++) {

       ProcessComposition(compositions[i]);

       cout << endl;

   }

   return 0;

}

#################################
Программа выводит следующий результат:
=== Processing composition ===

Title: Bohemian Rhapsody

Duration: 367

Genre: Rock

This is a song.

=== Processing composition ===

Title: Moon River

Duration: 160

Instrument: Piano

This is an instrumental track.

=== Processing composition ===

Title: Linus and Lucy

Duration: 146

Instrument: Jazz

This is an instrumental track.

####################################
@C++

Похожие вопросы
Предмет: Английский язык, автор: a06456582
Предмет: Алгебра, автор: Аноним