我有两个班级,Base
和Derived
。我有一个存储Derived*
指针列表的容器。
有一个信号/插槽机制在Base对象被销毁时发出信号,此时我们在~Base
析构函数内部,因此RTTI不能用于将Base*
转换为{{ 1}}(这是使用Qt,但问题不是Qt特定的)
该信号连接到管理指针容器的插槽。您可能已经猜到了,我想检查其对象被销毁的Derived*
指针是否对应于存储在容器内的Base*
指针,如果是,则将其从容器中删除。
我知道有许多替代设计,例如不使用Derived*
信号,或存储QObject::destroyed()
而非QObject*
的列表。但出于许多实际原因,我想使用那个。
这意味着,我想将基指针转换为派生指针,而不是用于解除引用,而是用于解除指针,并且我希望它被定义为子类树的行为(包括多重继承,虚函数.. )。
我可以使用static_cast吗?
谢谢!
答案 0 :(得分:4)
在评论中,您写道:
将转换指针与表Derived *指针进行比较以进行删除 它。当然我不会取消引用指针。
在这种情况下,根本不需要强制转换,您可以直接比较指针:
Base* base;
Derived* derived;
if(base == derived) {
}
答案 1 :(得分:3)
您可以对容器的每个元素使用static_cast
base
类型,并将其与*base ptr
进行比较。因此,你会找到对象。
class Base;
class Derived;
std::vector<Derived*> arrDerived;
void Remove(Base* pBase);
class Base
{
public:
~Base()
{
Remove(this);
}
};
class Derived : public Base
{
};
void Remove(Base* pBase)
{
for (Derived* pDerived : arrDerived)
{
//if (static_cast<Base*>(pDerived) == pBase) same as
if (pDerived == pBase)
{
//you found it!!!!
return;
}
}
}
执行static_cast<Base*>(Derived)
时,编译器只会将ptr
的内存量降低const
以下(因此它指向基类)。因此,此操作与实际内存状态无关,并且safe
为您。
编辑:正如@alain所提到的,您可以在没有static_cast
的情况下进行比较 - 它会自动执行。