模板运算符返回对抽象的引用 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
异常。您的代码必须准备好处理抛出的异常。
伙计们,为什么这段代码不起作用?
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
异常。您的代码必须准备好处理抛出的异常。