我有两个类,一个继承自另一个。基类的相关部分如下(显然这个类有ctors、dtor等,尤其是一个operator[]
,但我认为那些与手头的事情无关):
#include <array>
template < class T, unsigned int N >
class Vector
{
public:
template < class U, unsigned int M > friend Vector< U, M > operator+ ( const Vector< U, M >&, const Vector< U, M >& );
template < class U, unsigned int M > friend std::ostream& operator<< ( std::ostream&, const Vector< U, M >& );
};
派生类(同样,显然我已经删除了那些我认为不相关的部分):
#include "Vector.h"
template < class T, unsigned int N >
class Polynomial
: public Vector< T, N >
{
public:
template < class U, unsigned int M > friend std::ostream& operator<< ( std::ostream&, const Polynomial< U, M >& );
};
(注意:友元函数对模板使用的字母与类不同,因为否则 gcc 会抱怨“阴影”。不过,逻辑是相同的。)
Vector
s 以一种方式打印出来(例如< 3, 5, 1 >
);Polynomial
s 打印出另一个(例如3 x^2 + 5 x + 1
)。
但是,这会导致问题。当我将两个Polynomial
s 相加时,编译器使用template < class U, unsigned int M > Vector< U, M > operator+ ( const Vector< U, M >&, const Vector< U, M >& )
,它当然会返回一个Vector
。因此,如果我尝试执行类似的操作std::cout << poly1 + poly2;
,则结果显示格式错误。
我想修改template < class U, unsigned int M > Vector< U, M > operator+ ( const Vector< U, M >&, const Vector< U, M >& )
它以检测其参数的实际数据类型,并相应地转换返回值(例如,Polynomial
如果将两个Polynomial
s 传递给它,则返回 a )。如果可能的话,我想这样做,而不operator+
知道每个可能的子类Vector
(我认为这可能是一个合理的愿望?),并且不operator+
为每个子类创建一个新函数(因为我还有其他几个重载的运算符,并且希望避免为每个派生类复制几乎完全相同的代码十次)。
我知道这在 Python 中是可能的(事实上,相对容易)。C++ 支持这样的事情吗?