gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:09 25 4
gpt4 key购买 nike

我来自 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]->getRange(); 我也希望将 vector 保持为 的 vector 几何对象。我做错了什么吗?

最佳答案

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

尝试在 GeomObject 中添加这个:

virtual T getRange() = 0;

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

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

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

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

不得不求助于此,通常是一种代码味道。 IE。这表明您的设计可以改进。

关于c++ - 在 C++ 中访问继承类的特定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37161650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com