#include<iostream>
using namespace std;
class Base{
public:
virtual int f()const{
cout<<"Base::f()"<<endl;
return 1;
}
virtual void f(string)const{
cout<<"Base::f(string)"<<endl;
}
virtual void g() const{
cout<<"Base::g()"<<endl;
}
};
class Derived1 : public Base{
public:
void g()const{
cout<<"Base::g()"<<endl;
};
};
class Derived2 : public Base{
public:
int f()const{
cout<<"Derived2::f()"<<endl;
return 2;
}
};
class Derived3 : public Base{
public:
/* void f()const{
cout<<"Derived3::f()"<<endl;
}*/
};
class Derived4 : public Base{
public:
int f(int) const{
cout<<"Derived4::f(int)"<<endl;
return 4;
}
};
int main()
{
string s("Hello");
Derived1 d1;
int x=d1.f();
d1.f(s);
Derived2 d2;
x=d2.f();
//d2.f(s);
Derived4 d4;
//x=d4.f(1);
//d4.f(s);
Derived4& br=d4;
br.f(1);
//br.f();
//br.f(s);
return 0;
}
#include<iostream>
using namespace std;
class PetFood{
public:
virtual string foodType()const=0;
};
class Pet{
public:
virtual string type() const=0;
virtual PetFood* eats()=0;
};
class Bird : public Pet{
public:
string type() const{
return "Bird";
}
class BirdFood : public PetFood{
public:
string foodType()const{
return "Bird food";
}
};
PetFood* eats(){
return &bf;
}
private:
BirdFood bf;
};
class Cat : public Pet{
public:
string type() const{
return "Cat";
}
class CatFood : public PetFood{
public:
string foodType() const{
return "Birds";
}
};
CatFood* eats(){
return &cf;
}
private:
CatFood cf;
};
int main()
{
Bird b;
Cat c;
Pet* p[]={&b,&c};
for(int i=0;i<sizeof p / sizeof *p;i++)
{
//cout<<p[i]->type()<<" eats "<<p[i]->eats()->foodType()<<endl;
}
Cat::CatFood* cf=c.eats();
Bird::BirdFood* bf;
//bf=(Bird::BirdFood*)(b.eats());
bf=dynamic_cast<Bird::BirdFood*>(b.eats());
cout<< bf->foodType();
return 0;
}