Предположим, у нас есть класс A и B следующим образом:Может ли static_cast выполняться из базового класса в производный класс, если производный класс содержит дополнительные методы и члены?
class A
{
private:
int a;
public:
void seta(int a_)
{
a=a_;
}
int geta()
{
return a;
}
};
class B: public A
{
private:
int b;
public:
int getb()
{
return b;
}
void setb()
{
b=geta()+1;
}
};
и предположим, что я делаю такой код в функции:
A* a=new A();
a->seta(5);
B* b=static_cast<B*>(a);
b->setb();
cout<<b->getb()<<" and "<<b->geta()<<endl;
Этот код компилируется и работает, но меня смущает, почему? Если a
является указателем на класс A
, и при распределении только память для class A
членов зарезервирована (во время выполнения), почему после статического приведения кажется, что этот объект фактически является экземпляром class B
. Это безопасная операция?
Я подумал, что это неопределенное поведение. И должна ли ваша верхняя строка говорить «A и B»? – Carcigenicate
Я тоже подумал. Но похоже, что это работает, и я не знаю почему? – user3616359
Если ваш код имеет неопределенное поведение, компилятор не обязан сообщать вам, и получающаяся в результате программа может вообще что-либо сделать - включая, казалось бы, работу правильно. Это не значит, что это хорошая идея. –