运算符重载和继承(保持同一类型)
Operator overloading and inheritance (keeping the same type)
我对 C++ 中的运算符重载和继承有一些疑问。
速写:
class A {
public:
A operator+ (const A &b) const { ... }
};
class B : public A {
...
};
现在假设我有两个实例 B
、x
和 y
。如果我添加它们,我将得到 A
类型的东西,但我希望它是 B
.
类型的东西
完成此任务的最佳方法是什么(除了在 class B
中重新实现它们)? CRTP?
您可以在 class 之外实现 operator+
作为模板:
template<class type> type operator+(const type& left, const type& right)
{
type toReturn;
toReturn.value = left.value + right.value;
return toReturn;
}
class A {
private:
int value;
template <class type>
friend type operator+<type>(const type& left, const type& right);
};
class B : public A {
};
int main()
{
B test1, test2;
B test3 = test1 + test2;
}
这种方法有一定的缺点。编译器将主动尝试为您不想定义 operator+
的类型实例化 operator+
模板,因此请注意这一点。
我对 C++ 中的运算符重载和继承有一些疑问。
速写:
class A {
public:
A operator+ (const A &b) const { ... }
};
class B : public A {
...
};
现在假设我有两个实例 B
、x
和 y
。如果我添加它们,我将得到 A
类型的东西,但我希望它是 B
.
完成此任务的最佳方法是什么(除了在 class B
中重新实现它们)? CRTP?
您可以在 class 之外实现 operator+
作为模板:
template<class type> type operator+(const type& left, const type& right)
{
type toReturn;
toReturn.value = left.value + right.value;
return toReturn;
}
class A {
private:
int value;
template <class type>
friend type operator+<type>(const type& left, const type& right);
};
class B : public A {
};
int main()
{
B test1, test2;
B test3 = test1 + test2;
}
这种方法有一定的缺点。编译器将主动尝试为您不想定义 operator+
的类型实例化 operator+
模板,因此请注意这一点。