這裏是我的測試例子:如何使用reinterpret_cast的強制轉換爲派生類指針在C++中
struct base {
virtual ~base(){}
int x;
};
struct derived: public virtual base {
base * clone() {
return new derived;
}
derived(): s("a") {}
std::string s;
};
int main() {
derived d;
base * b = d.clone();
derived * t = reinterpret_cast<derived*>(b);
std::cout << t->s << std::endl;
return 0;
}
它崩潰,在那裏我打印■行。由於「b」是派生類的指針,因此reinterpret_cast應該可以工作。我想知道它爲什麼崩潰。同時,如果我用dynamic_cast替換reinterpret_cast,那麼它可以工作。
如果不是虛擬繼承,'static_cast'會起作用。當你確定你的基地是派生的時候,你不需要去運行。 –
是的,你是對的,如果我刪除_virtual_並使它只是結構派生:public base,那麼reinterpret_cast也可以(至少沒有崩潰) – Andrei
K-ballo:你知道,構建庫時的醜陋的繼承規則(你不知道未來是否會通過兩條路徑繼承一個類)爲了防萬一,有時會強迫你濫用虛擬繼承。 –