在派生类中重新定义虚拟运算符==

时间:2016-01-26 16:24:40

标签: c++

我要在派生类上重新定义operator ==。基类具有operator ==本身的重新定义,即:

virtual bool operator==(const Dress &c) const {
    return brand==c.brand && size==c.size
}

在这种情况下,我认为brand==c.brandthis.brand==c.brand相同。 在我的派生类中,我使用相同的函数签名。

virtual bool operator==(const Dress &c) const

我的问题是:

使用

检查参数类型是否匹配是否正确
typeid(this) == typeid(c)

因为这个重新定义的函数只会在派生类'元素上调用? 我不理解的是,在derived_class_object == base_class_object这样的对象上调用时,如何重新定义函数返回false?

基础课程

class Dress {
private:
    string brand;
    int size;
public:
Dress(string b="unknown", int s=40): brand(b), size(s) {}
virtual bool operator==(const Dress &c) const {
        return brand==c.brand && size==c.size
    }

派生类

class Tshirt: public Dress {
private:
bool is_shortsleeve;
public:
Tshirt(string b="unknown", int s=40, bool t=true):Capo(b,s),is_shortsleeve(t) {}
virtual bool operator==(const Dress &c) const {

...

}

我需要在其他控件旁边检查两个元素是否属于派生类。像我之前写的那样可以接受吗?

3 个答案:

答案 0 :(得分:3)

这是你在找什么?

#include <iostream>
#include <string>

class base
{
protected:
    int a;
public:
    base(int a) : a(a) {}
    virtual bool operator == (base & other) const
    {
        return (typeid(*this) == typeid(other)) && this->a == other.a;
    }
};

class derived : public base
{
public:
    derived(int a) : base(a)
    {}
    virtual bool operator == (base & other) const
    {
        derived* otherDerived = dynamic_cast<derived*>(&other);
        bool canBeCastToDerived = (0 != otherDerived);
        bool isExactlyTheSameType = (typeid(*this) == typeid(other));
        bool hasOtherProperties = false;

        if (otherDerived)
        {
            hasOtherProperties = (this->a == otherDerived->a);
        }

        return  canBeCastToDerived && isExactlyTheSameType && hasOtherProperties;
    }
};

int main()
{
    using std::cout;
    base one(1);
    derived two(2);

    cout << (one == one) << "\n";
    cout << (one == two) << "\n";
    cout << (two == one) << "\n";
    cout << (two == two) << "\n";
}

编辑1: 包括评论中的所有有效批评。

编辑2: 更改示例以明确包含其他变体。

答案 1 :(得分:3)

首先应该启用RunTimeTypeInformation(RTTI)。然后你可以使用dynamic_cast<Derived*>并查看你是否得到一个指向该对象的有效指针。如果对象是使用Derived构建的,那么它将返回一个有效的指针,否则为nullptr并且您知道它是其他内容。当然,你可以使用dynamic_cast<Base*>重试。

typeid()也可以使用typeid(*this) == typeid(c)

答案 2 :(得分:1)

一般情况下,thisc的类型不同,因此您需要的检查是

typeid(*this) == typeid(c)