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

Tar*_*rta 1 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;}
}
Run Code Online (Sandbox Code Playgroud)

在我的主要:

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

g_objects[0]->getRange(); //ERROR
Run Code Online (Sandbox Code Playgroud)

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

San*_*ker 7

getRange成员函数是不是部分GeomObject的定义,所以你不能通过指针调用它GeomObject.

尝试添加此内容GeomObject:

virtual T getRange() = 0;
Run Code Online (Sandbox Code Playgroud)

从进一步的评论中可以看出,getRange它特定于a Plane,因此不能作为(纯)虚拟成员函数添加GeomObject.

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

dynamic_cast<Plane<float>*>(g_objects[0])->getRange();
Run Code Online (Sandbox Code Playgroud)

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

不得不求助于此,通常是代码味道.IE浏览器.这表明您的设计可以改进.