before.cxx
#include <iostream>
class Dog {
public:
void runAway(void) {
std::cout << "HELP!!! Dog-god bless me!" << std::endl;
}
};
class DogHunter {
public:
void hunt(Dog &dog) {
dog.runAway();
}
};
class Bird {
public:
void flyAway(void) {
std::cout << "HELP!!! Bird-god bless me!" << std::endl;
}
};
class BirdHunter {
public:
void hunt(Bird &bird) {
bird.flyAway();
}
};
int main(void) {
Dog dog;
DogHunter dogHunter;
dogHunter.hunt(dog);
Bird bird;
BirdHunter birdHunter;
birdHunter.hunt(bird);
return 0;
}
after.cxx
#include <iostream>
class _Dog {
public:
virtual void runAway(void) = 0;
};
class Dog: public _Dog {
public:
void runAway(void) {
std::cout << "HELP!!! Dog-god bless me!" << std::endl;
}
};
class DogHunter {
public:
void hunt(_Dog &dog) {
dog.runAway();
}
};
class Bird {
public:
void flyAway(void) {
std::cout << "HELP!!! Bird-god bless me!" << std::endl;
}
};
class BirdAdapter: public _Dog {
public:
BirdAdapter(Bird &bird): bird(bird) {}
void runAway(void) {
bird.flyAway();
}
private:
Bird &bird;
};
int main(void) {
Dog dog;
DogHunter dogHunter;
dogHunter.hunt(dog);
Bird bird;
BirdAdapter birdAdapter(bird);
dogHunter.hunt(birdAdapter);
return 0;
}