There is a difference. Your "pointer" knows that the memory it points to should have the properties of class Ione, while your "pointer" knows that the memory it points to should have the properties of class two. (Your example uses ambiguous identifiers, which makes referencing difficult, doesn't it?)
In recommended design the base class defines an interface and the derived classes merely adjust the implementation. Therefore, all objects can be used via base class pointers; the user (pointer) does not need to know the true type.
class Base {
public:
Base();
void foo () { vfoo(); }
private:
virtualvoid vfoo();
};
class Derived : public Base {
public:
Derived() : Base() {}
void bizarre(); // questionable deviation from Base's interface
private:
virtualvoid vfoo();
};
...
Derived * p1 = new Derived;
Base * p2 = p1;
p1->foo(); // ok, Derived::vfoo() is called
p2->foo(); // ok, Derived::vfoo() is called
p1->bizarre(); // ok
p2->bizarre(); // error: there is no Base::bizarre()