C++中的多态性问题
Polymorphism Trouble in C++
我试图通过派生类的基类访问该派生类的数据成员,但遇到了一些问题。
这是代码:
for (auto actor : drawables) {
if (actor.isDrawable()) {
std::vector<glm::vec3> verts = actor.getVerticies();
for (glm::vec3 v : verts) {
// do stuff
}
}
}
但当我试着运行这个时,它说当我知道我已经在向量中添加了vec3时,verts的大小为0。
我有一个名为Actor3D的基类,它具有以下属性:
class Actor3D
{
private:
static int actorCount;
protected:
int id;
bool _isDrawable;
glm::vec3 position;
glm::vec3 rotation;
std::vector<glm::vec3> verts;
//std::vector<glm::vec3> color;
std::vector<glm::vec3> normals;
virtual void addVert(float x, float y, float z);
public:
virtual std::vector<glm::vec3> getVerticies() const { return verts; }
...
}
然后我有一个派生类,它的定义如下:
#include "engineActor3D.h"
class Cube : public Actor3D
{
public:
Cube();
~Cube();
};
在cpp文件中:
Cube::Cube()
{
_isDrawable = true;
position.x = 5;
position.y = 5;
position.z = 7;
addVert(-1.0, 0.0, -1.0);
addVert(-1.0, 0.0, 1.0);
addVert(1.0, 0.0, 1.0);
addVert(1.0, 0.0, -1.0);
}
Cube::~Cube()
{
}
有没有什么方法可以通过for循环中的基类访问verts向量?
代码看起来是正确的,但您没有向您展示如何填充drawables
和addVert
的主体。如果你能提供一个我们可以编译和运行的小例子,那会更好。对于这个用例来说应该不难。
请注意,您不需要将方法定义为虚拟方法,除非您在派生类中修改它们的行为,但这些方法不应该是这样。
此外,getVerticies()
(应该是getVertices()
)返回向量的副本,这可能不是有意的。
当你写for (auto actor : drawables)
时,你正在复制actor及其所有内容,这可能不是你的意思,我会写for (auto const &actor : drawables)
你也知道切片吗?如果您的drawables
被声明为std::vector<Actor3d>
,它只包含基类,而不包含派生的!现在,如果您创建一个多维数据集并将其添加到drawables
,那么您的代码应该可以工作,因为您的示例没有使用任何特定于Cube
的内容。
同样,如果你提供一个小的可复制的案例,它会更容易。带有指向的链接http://ideone.com/sphere-engine这将是完美的:)
相关文章:
- C++boost序列化多态性问题
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?
- 使用多态性解决代码重复问题
- 与智能指针和矢量C 的多态性有关的问题
- std::vector 和/或多态性的问题
- 多种继承和多态性问题
- C 成员功能多态性问题
- C 的多态性问题 - 数据覆盖
- 静态多态性问题
- 我正在尝试[C++]练习多态性和OOD原则。需要指导和几个问题的答案
- C++对象多态性问题
- 涉及指针成员变量和多态性的非常奇怪的问题
- 多态性和受保护的继承问题
- 多态性确定问题
- 当独生子女类具有虚拟方法时使用多态性的问题
- 解决这个多态性问题的最优雅的方法
- 试图用多态性来降视,出了什么问题?
- 带有列表的c++多态性问题
- c++中多态性基类和继承类实例化的问题
- 实例化子类的多态性问题