我要在派生类上重新定义operator ==。基类具有operator ==本身的重新定义,即:
virtual bool operator==(const Dress &c) const {
return brand==c.brand && size==c.size
}
在这种情况下,我认为brand==c.brand
与this.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 {
...
}
我需要在其他控件旁边检查两个元素是否属于派生类。像我之前写的那样可以接受吗?
答案 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)
一般情况下,this
和c
的类型不同,因此您需要的检查是
typeid(*this) == typeid(c)