如何使用虚函数返回指向基类的指针?

时间:2010-06-17 04:16:41

标签: c++ inheritance templates virtual return

我有一个名为Element的基类,一个名为Vector的派生类,我正在尝试从Vector中的Element重新定义两个虚函数。

//element.h
template <class T>
class Element
{
public:
Element();

virtual Element& plus(const Element&);
virtual Element& minus(const Element&);
};

并在另一个文件中

//Vector.h
#include "Element.h"

template <class T>
class Vector: public Element<T> {
T x, y, z;

public:

//constructors
Vector();
Vector(const T& x, const T& y = 0, const T& z =0);
Vector(const Vector& u);

...

//operations
Element<T>& plus(const Element<T>& v) const;
Element<T>& minus(const Element<T>& v) const;
... 

};

//sum
template <class T>
Element<T>& Vector<T>::plus(const Element<T>& v) const
{
Element<T>* ret = new Vector((x + v.x), (y + v.y), (z + v.z));
return *ret;
}

//difference
template <class T>
Element<T>& Vector<T>::minus(const Element<T>& v) const
{
Vector<T>* ret = new Vector((x - v.x), (y - v.y), (z - v.z));
return *ret;
}

但我总是得到

  

错误:'const class Element'没有名为'x'的成员

那么,我可以定义我的虚拟函数来使用Vector&amp;相反,或者有没有办法让我通过指向Element的指针访问Vector的数据成员?

我仍然是继承多态性的新手,fyi。

编辑:尝试一个static_cast(如下所示)并没有解决我的问题 - 或者我的语法错误。我用我能想象的两种方式尝试过静态演员,现在我的错误是&gt;错误:'const class Element'没有名为'x'的成员

我的更新代码是:     //和     模板     元和放大器; Vector :: plus(const Element&amp; v)const     {     Element * ret = static_cast *&gt;(operator new((x + v.x),(y + v.y),(z + v.z)));     返回*返回;     }

//difference 
template <class T> 
Element<T>& Vector<T>::minus(const Element<T>& v) const 
{ 
Element<T>* ret = new Vector<T>(static_cast<Vector*>((x - v.x), (y - v.y), (z - v.z)));
return *ret; 
} 

我认为继承多态的全部意义在于对派生类的引用实际上与对基类的引用相同。为什么我要跳过这些箍?

2 个答案:

答案 0 :(得分:1)

  

我可以定义我的虚拟功能以使用Vector&amp;作为参数而不是

没有;参数类型必须相同才能使函数覆盖基类虚函数。

  

我有办法通过指向Element的指针访问Vector的数据成员吗?

是的,但您需要使用Element&Vector&static_cast参数转换为dynamic_cast

如果您确定参数确实是static_cast,则只能使用Vector。当然,如果您知道这一点,那么您只需将参数类型更改为Vector&

如果您不确定自己确实拥有dynamic_cast,则可以使用Vector

const Vector<T>& w = dynamic_cast<const Vector<T>&>(v);

请注意,如果参数确实是Vector,这将成功,否则会因抛出std::bad_cast而失败。您可以改为转换指针(根据需要取消引用和获取地址),在这种情况下,失败将导致转换返回null而不是抛出异常。

也就是说,继承很可能是这里工作的错误工具:你的实际用例并不完全清楚。

答案 1 :(得分:1)

编译器说明显而易见的事情:基类Element没有 具有成员变量'x',因为x是在Vector中声明的而不在Element中。 试试这个:

Element<T>& plus(const Element<T>& v) const     {
const Vector<T> & vect = dynamic_cast<const Vector<T> &>(v);
Vector<T>* ret = new Vector((x + vect.x), (y + vect.y), (z + vect.z));
return *ret;
}

请注意,如果以这种方式返回指针,则可能会出现内存泄漏问题。