#include #include #include #include "animal.hpp" #include "cat.hpp" #include "dog.hpp" using boost::openmethod::virtual_ptr; struct Bulldog : canines::Dog { using Dog::Dog; }; BOOST_OPENMETHOD_CLASSES(canines::Dog, Bulldog); BOOST_OPENMETHOD_OVERRIDE( poke, (std::ostream & os, virtual_ptr dog), void) { canines::BOOST_OPENMETHOD_OVERRIDER( poke, (std::ostream & os, virtual_ptr dog), void)::fn(os, dog); os << " and bites back"; } auto main() -> int { boost::openmethod::initialize(); std::unique_ptr felix(new felines::Cat("Felix")); std::unique_ptr azaad(new felines::Cheetah("Azaad")); std::unique_ptr snoopy(new canines::Dog("Snoopy")); std::unique_ptr hector(new Bulldog("Hector")); poke(std::cout, *felix); // Felix hisses std::cout << ".\n"; poke(std::cout, *azaad); // Azaad hisses and runs away std::cout << ".\n"; poke(std::cout, *snoopy); // Snoopy barks std::cout << ".\n"; poke(std::cout, *hector); // Hector barks and bites std::cout << ".\n"; return 0; }