Skip to content

Instantly share code, notes, and snippets.

@JankDev
Created March 23, 2019 22:46
Show Gist options
  • Save JankDev/42a8598b4e4edb99b5c23e0b8fcfb57b to your computer and use it in GitHub Desktop.
Save JankDev/42a8598b4e4edb99b5c23e0b8fcfb57b to your computer and use it in GitHub Desktop.
Polymorphism C++
#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