before.cxx
#include <iostream>
class RobotCat {
public:
void cry(void) {
std::cout << "Meow! Meow! Meow!" << std::endl;
}
};
class RobotCatCanWalk: public RobotCat {
public:
void walk(void) {
std::cout << "Walking..." << std::endl;
}
};
class RobotCatCanTalk: public RobotCat {
public:
void talk(void) {
std::cout << "Talking..." << std::endl;
}
};
class RobotDog {
public:
void cry(void) {
std::cout << "Woof! Woof! Woof!" << std::endl;
}
};
class RobotDogCanWalk: public RobotDog {
public:
void walk(void) {
std::cout << "Walking..." << std::endl;
}
};
class RobotDogCanTalk: public RobotDog {
public:
void talk(void) {
std::cout << "Talking..." << std::endl;
}
};
int main(void) {
RobotCatCanTalk robotCatCanTalk;
robotCatCanTalk.cry();
robotCatCanTalk.talk();
RobotCatCanWalk robotCatCanWalk;
robotCatCanWalk.cry();
robotCatCanWalk.walk();
// RobotDogCanTalk robotDogCanTalk;
// robotDogCanTalk.cry();
// robotDogCanTalk.talk();
// RobotDogCanWalk robotDogCanWalk;
// robotDogCanWalk.cry();
// robotDogCanWalk.walk();
return 0;
}
after.cxx
#include <iostream>
#include "config.hxx"
class RobotPet {
public:
virtual void cry(void) = 0;
};
class RobotCat: public RobotPet {
public:
void cry(void) {
std::cout << "Meow! Meow! Meow!" << std::endl;
}
};
class RobotDog: public RobotPet {
public:
void cry(void) {
std::cout << "Woof! Woof! Woof!" << std::endl;
}
};
class RobotPetDecorator: public RobotPet {
public:
RobotPetDecorator(RobotPet &robotPet): robotPet(robotPet) {}
void cry(void) {
robotPet.cry();
}
private:
RobotPet &robotPet;
};
class RobotPetCanTalk: public RobotPetDecorator {
public:
RobotPetCanTalk(RobotPet &robotPet): RobotPetDecorator(robotPet) {}
void talk(void) {
std::cout << "Talking..." << std::endl;
}
};
class RobotPetCanWalk: public RobotPetDecorator {
public:
RobotPetCanWalk(RobotPet &robotPet): RobotPetDecorator(robotPet) {}
void walk(void) {
std::cout << "Walking..." << std::endl;
}
};
int main(void) {
RobotPetCanTalk robotPetCanTalk(*&_ROBOT_PET_());
robotPetCanTalk.cry();
robotPetCanTalk.talk();
RobotPetCanWalk robotPetCanWalk(*&_ROBOT_PET_());
robotPetCanWalk.cry();
robotPetCanWalk.walk();
}
config.hxx
#define _ROBOT_PET_ RobotCat
// #define _ROBOT_PET_ RobotDog