假設有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
如果您的代碼具有未定義的行爲,編譯器不需要告訴您,並且生成的程序可以執行任何操作 - 包括似乎正常工作。這並不意味着這是一個好主意。 –