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>&);
};
我虽然因为引用是一个指针然后,我不知道,两个运算符的定义是等价的;但它们似乎是独立的功能。有没有什么可以保留虚拟运算符在“摘要”中仍然有代码功能?
答案 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
例外。您的代码必须准备好处理抛出的异常。