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

时间:2015-02-06 16:45:43

标签: c++ templates operators abstract-class

Fellas,为什么这段代码不起作用?

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>&);
};

我虽然因为引用是一个指针然后,我不知道,两个运算符的定义是等价的;但它们似乎是独立的功能。有没有什么可以保留虚拟运算符在“摘要”中仍然有代码功能?

2 个答案:

答案 0 :(得分:3)

  

两个运营商的定义都是等价的

不,他们不是。一个参数具有Abstract&参数,另一个参数具有Not_Abstract&参数。要覆盖,参数类型必须匹配,以便可以以与覆盖的函数相同的方式调用覆盖。

  

在“摘要”中是否可以执行任何操作来保留虚拟操作符并仍然具有代码功能?

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

答案 1 :(得分:1)

要使派生类中的函数成为基类中虚拟成员函数的实现,必须声明它以使参数类型保持不变:

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例外。您的代码必须准备好处理抛出的异常。