首页 文章

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

提问于
浏览
1

我有一个名为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的数据成员?

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

编辑:尝试static_cast(如下所示)并没有解决我的问题 - 或者我的语法错误 . 我已经尝试过两种我想象的静态转换,现在我的错误是>错误:'const class Element'没有名为'x'的成员

我更新的代码是:// sum模板Element&Vector :: plus(const Element&v)const {Element * ret = static_cast >(operator 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; 
}

我认为继承多态的整个要点是对派生类的引用实际上与对基类的引用相同 . 为什么我要跳过这些篮球?

2 回答

  • 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;
    }
    

    请注意,如果以这种方式返回指针,则可能存在任何内存泄漏问题 .

  • 1

    我可以定义我的虚函数来取代Vector&作为参数

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

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

    是的,但您需要使用 static_castdynamic_castElement& 参数强制转换为 Vector& .

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

    如果你不确定你确实有一个 Vector ,你可以使用 dynamic_cast

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

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

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

相关问题