簡體   English   中英

將基類的指針轉換為派生類(參考)

[英]Casting base class pointer to derived class (reference)

我正在使用類,其中包含一個方法的幾個重載版本。 每個版本都帶有一個參數-對象-該對象始終從一個基類派生。 (沒有采用基類參數的方法)。

class Base { ... }
class Object1 : public Base { ... }
class Object2 : public Base { ... }
class Object3 : public Base { ... }

class T
{
    // ... 
    do_sth(const Object1& obj);
    do_sth(const Object2& obj);
    do_sth(const Object3& obj);
    // ...
}

然后,我創建帶有指向Base類的unique_ptr向量,其中包含(僅)派生類對象。

std::vector<std::unique_ptr<Base>> vect;    // then some push_backs

現在,我想為T::do_sth中的每個對象調用T::do_sth vect ,如下所示:

for (auto& object : vect)
    T_obj.do_sth(*object);

但是,這是不可能的,因為render(*object)調用do_sth(Base) ,它甚至不存在(並且不會被視為行為)。 我嘗試用幾種不同的方法(使用強制轉換)替換該行,但是我的嘗試均未成功。 如何解決?

鑒於注釋中的要求“不修改任何Object類,沒有虛函數”,這里的第一個解決方案似乎是dynamic_cast ,因此可以這樣使用:

for (auto const& uObj : vect) {
    if(auto *obj = dynamic_cast<Object1 const *>(uObj.get()))
        T_obj.do_sth(*obj);
    else if(auto *obj = dynamic_cast<Object2 const *>(uObj.get()))
        T_obj.do_sth(*obj);
    else if( /* ... */)
        // And so on.
}

這通常是我使用一次性宏的地方-使用后果自負。

#define DYNAMIC_CALL_DO_STH(Type) \
    if(auto *obj = dynamic_cast<Type const *>(uObj.get())) \
        T_obj.do_sth(*obj)

for (auto const& uObj : vect) {
    DYNAMIC_CALL_DO_STH(Object1);
    else
    DYNAMIC_CALL_DO_STH(Object2);
    else
    DYNAMIC_CALL_DO_STH(Object3);
}

#undef DYNAMIC_CALL_DO_STH

暫無
暫無

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

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