The pointer p had to be used. Other than that, you could write any additional code, including as many classes as necessary to insure that the "bar()" method was called using the object pointed to by p.
As many classes as necessary, you say?
#include <iostream> class Base { public: void foo() { std::cout << "foo" << std::endl; } }; class Derived : public Base { public: void bar() { std::cout << "bar" << std::endl; } }; int main() { class Base { public: void bar() { std::cout << "bar" << std::endl; } }; class Derived : public Base { }; Base *p = new Derived; p->bar(); }