У меня есть базовый класс Element, производный класс Vector, и я пытаюсь переопределить две виртуальные функции из Element in Vector.
//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 нет элемента с именем 'x'
Итак, могу ли я определить свои виртуальные функции для принятияVector & в качестве аргумента вместо этого, или у меня есть способ получить доступ к элементам данных Vector через указатель на Element?
Я все еще новичок в полиморфизме наследования, к вашему сведению.
РЕДАКТИРОВАТЬ: Попытка static_cast (как предложено ниже) не решила мою проблему - или у меня неправильный синтаксис для него.Я пробовал статическое приведение двумя способами, которые я мог себе представить, и теперь моя ошибка:> error: в элементе const class нет элемента с именем 'x'
Мой обновленный код: // sum templateElement & Vector :: plus (const Element & v) const {Element * ret = static_cast *> (оператор new ((x + vx), (y + vy), (z + vz)));возврат * 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;
}
Я думал, что весь смысл полиморфизма наследования заключается в том, что ссылка на производный класс практически такая же, как ссылка на базовый класс.Почему я должен прыгать через эти обручи?