在C ++中访问继承类的特定方法

时间:2016-05-11 11:44:16

标签: c++ inheritance

我来自Java背景,我有以下小方案,不符合我的理解:

template<typename T>
class GeomObject{
  public:
    T position;

    virtual Vec3<T> getPosition() = 0;
}


template<typename T>
class Plane : public GeomObject<T> {
  public:
    Vec3<T> position;
    T range;

    Vec3<T> getPosition() { return position; }
    T getRange() { return range;}
}

在我的主要:

vector<GeomObject<float>*> g_objects;
g_objects.push_back(new Plane<float>());

g_objects[0]->getRange(); //ERROR

我无法以某种方式访问​​getRange()方法。这在Java中是可能的,但这不是,甚至不是通过强制转换(Sphere)g_objects [0] - &gt; getRange(); 我希望将矢量保持为 GeomObjects 。有什么我做错了吗?

1 个答案:

答案 0 :(得分:7)

getRange成员函数不是GeomObject定义的一部分,因此您无法通过指向GeomObject的指针调用它。

尝试在GeomObject

中添加此内容
virtual T getRange() = 0;

通过进一步的评论,它明确指出getRange特定于Plane,因此无法在GeomObject中添加为(纯)虚拟成员函数。

在这种情况下,您仍然可以访问Plane::getRange,但您必须首先向下转发指针。例如。使用dynamic_cast

dynamic_cast<Plane<float>*>(g_objects[0])->getRange();

(为简洁起见,省略错误检查)。

不得不诉诸于此,通常是代码味道。 IE浏览器。这表明你的设计可以改进。