假设有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
如果您的代码具有未定义的行为,编译器不需要告诉您,并且生成的程序可以执行任何操作 - 包括似乎正常工作。这并不意味着这是一个好主意。 –