模板运算符返回对抽象的引用 class

Template operator returning a reference to an abstract class

伙计们,为什么这段代码不起作用?

template <typename t>
class Abstract
{
public:
   ~Abstract(){}
   virtual Abstract<t>& operator +(Abstract<t>&) = 0;
};

template <typename t>
class Not_Abstract : public Abstract
{
t* tab; //let Not_Abstract store an array of objects of type t, whatever
public:
  ~Not_Abstract(){ delete[] tab; }
  Not_Abstract<t>& operator +(Not_Abstact<t>&);
};

虽然我不知道,因为引用是一个指针,所以我不知道,两个运算符的定义是等价的;但它们似乎是独立的功能。是否可以采取任何措施来保留 "Abstract" 中的虚拟运算符并仍然使代码正常运行?

both operator's definitions are equivalent

不,他们不是。一个有一个 Abstract& 参数,另一个有一个 Not_Abstract& 参数。要重写,参数类型必须匹配,这样重写就可以像被重写的函数一样被调用。

Is there anything that can be done to retain virtual operator in "Abstract" and still have the code functioning?

覆盖将必须采用 Abstract&,并且无论是否使用 Non_Abstract 调用它都要做正确的事情。

要使派生 class 中的函数成为基 class 中虚成员函数的实现,必须对其进行声明,使参数类型保持不变:

Not_Abstract<t>& operator +(Abstact<t>&);

如果你想确保你处理的是Non_Abstract的实例作为运算符的RHS,你必须在函数的实现中执行一个dynamic_cast

template <typename t>
Not_Abstract<t>& Not_Abstract<T>::operator +(Abstact<t>& rhsBase)
{
   Not_Abstract<t>& rhs = dynamic_cast<Not_Abstract<t>&>(rhsBase);
   // ... Now work with a Not_Abstract object
   // ....

}

如果 rhsBase 无法转换为 Not_Abstract<t>&dynamic_cast 将抛出 std::bad_cast 异常。您的代码必须准备好处理抛出的异常。