簡體   English   中英

為什么 static_cast 有效但 dynamic_cast 失敗?

[英]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_castDerivedB轉換為DerivedA沒有問題。 為什么會這樣? 我可以理解,如果我會投到Base但不是那樣。 同時, dynamic_cast按預期工作, DerivedBDerivedA失敗。

將作為DerivedB*static_cast結果的指針取消引用到DerivedA*的行為是undefined 這是一個嚴格的混疊違規。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM