Тема: Поліморфізм
Привіт.
Задача
Спроектувати (нарисувати) і реалізувати ієрархію класів, що описують предметну область «Мутант» (CMutant), що був отриманий шляхом схрещування пса Бобіка (описується класом CDog) і свині Хрюші (описується класом CPig). Класи CDog і CPig мають спільний батьківський клас CAnimal. Додаткові вимоги:
1. Базовий клас містить мінімум одну віртуальну функцію (наприклад, яка виводить на екран текстом звук, який видає тваринка).
2. Забезпечити механізми коректної роботи конструкторів і деструкторів.
3. Перевантажити operator = з метою його коректної роботи.
4. Кожен з класів має містити мінімум один член даних і 4 функції-члени.
5. Написати main() функцію де створити об’єкт класу CMutant і продемонструвати різницю між статичним і динамічним поліморфізмом.
Ось моє вирішення!
class CAnimal {
protected:
char *name;
public:
CAnimal();
CAnimal(const CAnimal&);
CAnimal(const char*);
virtual ~CAnimal();
virtual void call();
virtual void massage();
};
class CDog: virtual public CAnimal {
protected:
char *language;
public:
CDog();
CDog(const CDog&);
CDog(const char*);
void operator=(const CDog*);
void call();
void massage();
void setLanguage(const char*);
const char *getLanguage();
virtual ~CDog();
};
class CPig: virtual public CAnimal {
protected:
char *lag;
public:
CPig();
CPig(const char*);
CPig(const CPig&);
void operator=(const CPig&);
virtual void call();
virtual void massage();
void setlag(const char*);
const char *getlag();
virtual ~CPig();
};
class CMutant: public CPig, public CDog
{
private:
char *mass;
public:
CMutant();
CMutant(const char*);
CMutant(const CMutant&);
~CMutant();
void operator=(const CMutant&);
void call();
void massage();
const char *getMassage();
void setMassage(const char*);
};
#include "mutant.h"
#include <cstring>
#include <iostream>
using namespace std;
CAnimal::CAnimal() {
name = new char[128];
}
CAnimal::CAnimal(const CAnimal &that) {
name = new char[128];
strcpy(name, that.name);
}
CAnimal::CAnimal(const char *init_name) {
name = new char[128];
strcpy(name, init_name);
}
CAnimal::~CAnimal() {
delete[] name;
}
void CAnimal::call() {
cout << "Name " << name <<endl;
}
void CAnimal::massage() {
cout << "prosto text dlya kilkosti "<<endl;
}
CDog::CDog() {
language = new char[128];
strcpy(name, "sobaka ");
strcpy(language, "gav gav ");
}
CDog::CDog(const CDog& that) {
language = new char[128];
strcpy(name, that.name);
strcpy(language, that.language);
}
CDog::CDog(const char *initName) {
language = new char[128];
strcpy(name, initName);
strcpy(language, "gav gav ");
}
void CDog::call() {
cout << "sobaka " << name << '\t' << language << endl;
}
void CDog::massage() {
cout << "gav gav gav"<<endl ;
}
void CDog::operator=(const CDog *that) {
strcpy(this->name, that->name);
strcpy(this->language, that->language);
}
void CDog::setLanguage(const char *init_lang) {
strcpy(language, init_lang);
}
const char *CDog::getLanguage() {
return language;
}
CDog::~CDog() {
delete[] language;
}
CPig::CPig() {
lag = new char[128];
strcpy(name, "svinia ");
strcpy(lag, "4");
}
CPig::CPig(const char *init_name) {
lag = new char[128];
strcpy(name, init_name);
strcpy(lag, "4");
}
CPig::CPig(const CPig &that) {
strcpy(this->name, that.name);
strcpy(this->lag, that.lag);
}
void CPig::call() {
cout << "admin\t" << name << '\t' << lag << '\n';
}
void CPig::massage() {
cout << "i have lag"<<endl;
}
void CPig::setlag(const char* init_lag) {
strcpy(lag, init_lag);
}
void CPig::operator=(const CPig &that) {
strcpy(this->name, that.name);
strcpy(this->lag, that.lag);
}
const char *CPig::getlag() {
return lag;
}
CPig::~CPig() {
delete[] lag;
}
CMutant::CMutant() {
mass = new char[128];
strcpy(mass, "my massage");
}
CMutant::CMutant(const char *init_massage) {
mass = new char[128];
strcpy(mass, init_massage);
}
void CMutant::call() {
cout << "animal " << name << '\t' << lag << '\t'
<< language << '\t' << mass << '\n';
}
void CMutant::massage() {
cout << mass << '\n';
}
void CMutant::setMassage(const char *init_massage) {
strcpy(mass, init_massage);
}
const char *CMutant::getMassage() {
return mass;
}
void CMutant::operator=(const CMutant &that) {
strcpy(this->name, that.name);
strcpy(this->mass, that.mass);
strcpy(this->lag, that.lag);
strcpy(this->language, that.language);
}
CMutant::~CMutant() {
delete[] mass;
}
#include "mutant.h"
#include <iostream>
using namespace std;
int main() {
CAnimal *a[4];
a[0] = new CMutant("m");
a[1] = new CDog("sobaka ");
a[2] = new CPig("svinia");
a[3] = new CAnimal("a");
a[0]->call();
a[1]->call();
a[2]->call();
a[3]->call();
delete a[0];
delete a[1];
delete a[2];
delete a[3];
return 0;
}
Хто знається, гляньте код!
Він працює, але чи правильно(коректно)?
Бо сам до кінця не усвідомлюю всіх тонкощів, оскільки писав по прикладу з книги!
продемонструвати різницю між статичним і динамічним поліморфізмом.
Це також присутнє, але не певен чи належним чином!