[英]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.