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