Why does this static C++ cast work?

Posted: edited May 19 at 18:26 - Source : stackoverflow

Imagine this code:

class Base {
  virtual void foo(){}

class Derived: public Base {
    int i;
    void foo() override {}
    void do_derived() {
      std::cout << i;

int main(){
  Base *ptr = new Base;
  Derived * static_ptr = static_cast<Derived*>(ptr);
  static_ptr->i = 10;  // Why does this work?
  static_ptr->foo(); // Why does this work?
  return 0;

Why do I get the result 10 on the console? I wonder because I thought the ptr is a pointer to a base object. Therefore the object doesn't contain a int i or the method do_derived(). Is a new derived-Object automatically generated?

When I declare a virtual do_derived() method in the Base class too, then this one is chosen, but why?