Представьте этот код:
class Base {
public:
virtual void foo(){}
};
class Derived: public Base {
public:
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;
}
Почему я получаю результат 10 на консоли? Интересно, потому что я думал, что ptr является указателем на базовый объект. Поэтому объект не содержит int я или метод do_derived()
. Создан ли новый производный объект?
Когда я объявляю виртуальный метод do_derived()
в классе Base тоже, то этот выбирается, но почему?