我偶然發現從派生類派生類派生,並發現我的知識存在差距。我一直生活在這個可能的世界 - 直到現在。相反,std::bad_cast
被拋出。這裏發生了什麼?Can not dynamic_cast sideways
#include <iostream>
class Base
{
protected:
int x_;
public:
Base(int x) : x_(x) {}
virtual ~Base() = default;
int x() const { return x_; }
virtual void setX(int x) = 0;
};
class Editable : public Base // class implements setters
{
public:
Editable(int x) : Base(x) {}
void setX(int x) { x_ = x; }
};
class ReadOnly : public Base // class implements empty setters
{
public:
ReadOnly(int x) : Base(x) {}
void setX(int x) {}
};
int main()
{
Editable editable(4);
ReadOnly &readOnly = dynamic_cast<ReadOnly&>(editable); // std::bad_cast
}
當然,它可以側身投(儘管這不是真的你正在使用的意義上),但事情你實際上是鑄造仍須是一個'ReadOnly'(或從它派生的類)... –
「與其他類型轉換不同,dynamic_cast涉及運行時類型檢查,如果綁定到該指針的對象不是目標類型的對象,則失敗並且該值爲0.如果它在失敗時是引用類型,則會拋出bad_cast類型的異常。「 – SChepurin