【发布时间】:2011-03-04 18:46:30
【问题描述】:
我有一个名为 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& 作为参数,还是有办法让我通过指向 Element 的指针访问 Vector 的数据成员?
我对继承多态性还是很陌生,仅供参考。
编辑:尝试 static_cast(如下所示)并没有解决我的问题——或者我的语法错误。我以我能想象的两种方式尝试了静态转换,现在我的错误是 > error: 'const class Element' has no member named 'x'
我更新的代码是: //和 模板 元素&向量::plus(const Element& v) const { 元素* ret = static_cast*>(操作符 new((x + v.x), (y + v.y), (z + v.z))); 返回 *ret; }
//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;
}
我认为继承多态性的全部意义在于对派生类的引用实际上与对基类的引用相同。为什么我必须跳过这些圈子?
【问题讨论】:
-
getx这个词没有出现在您的代码 sn-p 中。我认为你错过了一些东西。 -
哎呀!在我发布时修复了代码 - 忘记更改错误消息。应该是:>错误:'const class Element
'没有名为'x'的成员
标签: c++ inheritance templates virtual return