如何在Base析构函数中将Base *与Derived *列表进行匹配?

时间:2016-05-30 09:47:58

标签: c++ pointers casting derived-class rtti

我有两个班级,BaseDerived。我有一个存储Derived*指针列表的容器。

有一个信号/插槽机制在Base对象被销毁时发出信号,此时我们在~Base析构函数内部,因此RTTI不能用于将Base*转换为{{ 1}}(这是使用Qt,但问题不是Qt特定的)

该信号连接到管理指针容器的插槽。您可能已经猜到了,我想检查其对象被销毁的Derived*指针是否对应于存储在容器内的Base*指针,如果是,则将其从容器中删除。

我知道有许多替代设计,例如不使用Derived*信号,或存储QObject::destroyed()而非QObject*的列表。但出于许多实际原因,我想使用那个。

这意味着,我想将基指针转换为派生指针,而不是用于解除引用,而是用于解除指针,并且我希望它被定义为子类树的行为(包括多重继承,虚函数.. )。

我可以使用static_cast吗?

谢谢!

2 个答案:

答案 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为您。

编辑:正如@a​​lain所提到的,您可以在没有static_cast的情况下进行比较 - 它会自动执行。