将const基本引用转换为派生的

时间:2016-08-03 09:54:05

标签: c++ qt casting qt5

我有一个问题,但我不知道我是否正确解决了问题,或者是否有更正确的方法。

现在,我有两个类(一个继承自另一个):

class Data_Base
{
...
}

class Data_Error : public Data_Base
{
...
}

现在,在等于运算符的重载中,我必须再次将对象的const引用转换为派生对象,以便测试其成员。目前我这样做:

bool Data_Error::operator==(const Data_Base &other) const
{
    if (Data_Base::operator !=(other))
        return false;

    const Data_Error &other_cast = (const Data_Error &)other;

    ... More tests on other_cast ...
}

现在,由于other Data_Error运算符(以及{{1} Data_Base变量不是==变量,因此{@ 1}}变量不是!=。运算符,因为它实现为==的否定也检查派生对象的类型,所以只有在类型正确的情况下才会到达该行。

现在,这有什么问题吗?有没有更正确的"溶液

我正在使用Qt(5.7),所以有更多的QTish"溶液

2 个答案:

答案 0 :(得分:1)

应该避免C风格的演员阵容。你可以找到here的原因。你应该使用静态强制转换:

const Data_Error &other_cast = static_cast<const Data_Error &>(other);

或者动态强制转换以在运行时检查其他有效类型为Data_Error:

const Data_Error &other_cast = dynamic_cast<const Data_Error &>(other);

答案 1 :(得分:1)

正确的方法是在指针上使用dynamic_cast,因为如果对象不是正确的派生类型,它只返回null。你的例子将成为:

bool Data_Error::operator==(const Data_Base &other) const
{
    if (Data_Base::operator !=(other))
        return false;

    const Data_Error *other_cast = dynamic_cast<const Data_Error *>(&other);
    if (other_cast == nullptr) { // not the correct type
        return false;
    }

    ... More tests on *other_cast ...
}