[英]Why static_cast works but dynamic_cast fails?
假設我有一個基礎 class 和 2 個從中派生的類。 所有派生類都有自己的邏輯,它們之間不兼容。 測試應用如下:
#include <iostream>
#include <vector>
class Base
{
public:
Base(int x) { m_x = x; }
virtual int getResult() { return m_x; }
protected:
int m_x;
};
class DerivedA : public Base
{
public:
DerivedA(int x) : Base(x) {}
int getResult() override { return m_x * 2; }
};
class DerivedB : public Base
{
public:
DerivedB(int x) : Base(x) {}
int getResult() override { return m_x * m_x; }
};
int main()
{
std::vector<Base *> objects;
objects.push_back(new DerivedA(1));
objects.push_back(new DerivedB(2));
objects.push_back(new DerivedA(3));
objects.push_back(new DerivedB(4));
for(Base *object: objects)
{
DerivedA *obj = static_cast<DerivedA *>(object);
if(obj != nullptr)
{
std::cout << obj->getResult() << std::endl;
}
}
return 0;
}
我希望只得到 2 個結果,即只有DerivedA
類型的實例可以轉換為DerivedA
但不能轉換為DerivedB
。 但令我驚訝的是,事實並非如此。 static_cast
將DerivedB
轉換為DerivedA
沒有問題。 為什么會這樣? 我可以理解,如果我會投到Base
但不是那樣。 同時, dynamic_cast
按預期工作, DerivedB
為DerivedA
失敗。
將作為DerivedB*
的static_cast
結果的指針取消引用到DerivedA*
的行為是undefined 。 這是一個嚴格的混疊違規。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.