我来自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 。有什么我做错了吗?
答案 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浏览器。这表明你的设计可以改进。