我来自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的矢量.有什么我做错了吗?
该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浏览器.这表明您的设计可以改进.
归档时间: |
|
查看次数: |
50 次 |
最近记录: |