Created
March 23, 2019 22:46
-
-
Save JankDev/42a8598b4e4edb99b5c23e0b8fcfb57b to your computer and use it in GitHub Desktop.
Polymorphism C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <cstring> | |
#include <typeinfo> | |
#include <iostream> | |
#include <list> | |
#include <vector> | |
using namespace std; | |
class Object{ | |
public: | |
virtual string whatAmI()const=0; | |
virtual string toString()const =0; | |
virtual Object *clone()const =0; | |
virtual void operator+=(Object &object)=0; | |
}; | |
class StringObject: public Object{ | |
char *buf; | |
int length; | |
public: | |
StringObject():buf(nullptr),length(0){}; | |
StringObject(const char *text):length(strlen(text)){ | |
buf = new char[length+1]; | |
strcpy(buf,text); | |
}; | |
string whatAmI() const override{ | |
return typeid(this).name(); | |
} | |
operator const char*()const {return buf;} | |
Object *clone() const override{ | |
return new StringObject(buf); | |
} | |
string toString()const override{ | |
return buf; | |
} | |
void operator+=(Object &object) override{ | |
char *text = buf; | |
StringObject string = dynamic_cast<StringObject &>(object); | |
text=strcat(text,string); | |
buf=text; | |
length=strlen(buf); | |
} | |
}; | |
class IntObject: public Object{ | |
int number; | |
public: | |
IntObject():number(0){}; | |
IntObject(int _number):number(_number){}; | |
string whatAmI() const override{ | |
return typeid(this).name(); | |
} | |
operator const int()const {return number;} | |
Object *clone() const override{ | |
return new IntObject(number); | |
} | |
string toString() const override{ | |
return to_string(number); | |
} | |
void operator+=(Object &object){ | |
number+= dynamic_cast<IntObject &>(object); | |
} | |
}; | |
class DoubleObject: public Object{ | |
double number; | |
public: | |
DoubleObject():number(0.){}; | |
DoubleObject(int _number):number(_number){}; | |
string whatAmI() const override{ | |
return typeid(this).name(); | |
} | |
operator const double()const {return number;} | |
Object *clone() const override{ | |
return new DoubleObject(number); | |
} | |
string toString() const override{ | |
return to_string(number); | |
} | |
void operator+=(Object &object){ | |
number+= dynamic_cast<DoubleObject &>(object); | |
} | |
}; | |
void save2File(list<Object *> objects){ | |
for(Object *o:objects) | |
cout<<o->whatAmI()<<'\n'; | |
} | |
list<DoubleObject *> copyToOtherList(list<Object *> objects){ | |
list<DoubleObject *> doubleObjects; | |
for(Object *o:objects){ | |
if(o->whatAmI().find("DoubleObject")) | |
doubleObjects.push_back(dynamic_cast<DoubleObject *>(o)); | |
} | |
return doubleObjects; | |
} | |
vector<IntObject *> returnInts(list<Object *> objects){ | |
vector<IntObject *> intObjects; | |
for(Object *o:objects){ | |
if(o->whatAmI().find("IntObject")!=string::npos) | |
intObjects.push_back(dynamic_cast<IntObject *>(o)); | |
} | |
return intObjects; | |
} | |
string sumAllStrings(list<Object *> objects){ | |
string text = ""; | |
for(Object *o:objects){ | |
if(o->whatAmI().find("StringObject")!=string::npos) { | |
text += *dynamic_cast<StringObject *>(o); | |
} | |
} | |
return text; | |
} | |
int main(){ | |
Object *obj = new IntObject(2); | |
StringObject *text = new StringObject("hello"); | |
DoubleObject *doub = new DoubleObject(3.0); | |
list<Object *> objects; | |
objects.push_back(obj); | |
objects.push_back(text); | |
objects.push_back(doub); | |
cout<< dynamic_cast<IntObject &>(*obj); | |
save2File(objects); | |
objects.push_back(new StringObject(" world!")); | |
objects.push_back(new IntObject(5)); | |
for(IntObject *i: returnInts(objects)) cout<<*i<<'\n'; | |
cout<<sumAllStrings(objects); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment