#include class Animal { int i; public: Animal(int ii): i(ii) {}; Animal(const Animal &a): i(a.i){} void move() const{std::cout << "Animal::move\n";} }; class Dog : public Animal { int i; public: Dog(int ii): i(ii), Animal(ii) {} Dog(const Dog &d): Animal(d), i(d.i) {} virtual void move() const{std::cout << "Dog::move\n";} }; class Labrador : public Dog { int i; public: Labrador(int ii): i(ii), Dog(ii) {} Labrador(const Labrador &l): Dog(l), i(l.i) {} void move() const{std::cout << "Labrador::move\n";} }; void f(const Animal &a) {a.move();} void g(const Dog &d) {d.move();} void h(const Labrador &l) {l.move();} int main() { Labrador c(2); std::cout << "Labrador as animal:\n"; f(c); std::cout << "Labrador as dog:\n"; g(c); std::cout << "Labrador as Labrador:\n"; h(c); }