如何在 C++ 中从父 class 变量调用子 class 的重载方法
How does one call an overloaded method from a child class from a parent class variable in C++
现在,这个问题似乎已经被问过数百万次了,但我认为我的是个特例...
无论如何,我有这个 class:
class Personality {
public:
Personality() {};
virtual void Start () {
}
virtual void Update () {
}
virtual ~Personality() {};
};
我有这个覆盖版本:
class example : public Personality {
public:
example() {};
void Start (FuzzyGame::FuzzyObject& o);
void Update (FuzzyGame::FuzzyObject& o);
~example() {};
};
然后我有我的 GameObject class(又名 FuzzyObject):
class FuzzyObject {
public:
std::string name;
std::string tag;
std::string type;
FuzzyForm xform;
bool enabled = false;
std::string className;
Personality Pclass;
std::string path;
std::string texPath;
MD2Object animMesh;
bool isMD2;
LightData light;
CamData cam;
GLuint Texture;
BillboardType BBType;
};
我想知道的是:是否有可能从 example() class 调用一个方法,比如 Update(),使用这个基础实例 class,使用一些将它附加到("FuzzyObject")的 class 传递给该函数的方法?
Personality Pclass;
基本上,这就是我可以为我的游戏引擎创建基于 C++ 的脚本系统的全部内容。
更新:
通过阅读我批准的答案,我目前实际上正在使用这种方式:
example e;
e.Start(/*whatever should be here*/);
但我发现直接输入向量元素会导致段错误。我尝试了一个指向向量元素的指针,它起作用了。有点...任何人都知道为什么要像这样输入向量的元素:
example.Start(&myArray<FuzzyObject>[i]); //assuming this is in a for-loop
进入我的重载函数修改了我向量中的所有元素?!
又名。当 运行 更新一个对象(代码修改变换组件以将受影响的对象偏移 0.1)时,它也会偏移所有其他对象,这显然不是我想要的。有人知道这种奇怪行为的原因吗?
我只能假设问题的根源是一些奇怪的内存分配问题,只有 C++ 会出现...:D
更新 2:
我终于找到了我的另一个问题的根源(更新 1),这是真正愚蠢的事情,只会发生在 OpenGL 中......:D
事实证明它似乎在 std::vector 中修改整个 bang lot 的原因实际上根本不是向量指针;这是因为我忘记在绘制下一个对象之前加载单位矩阵!同样,当一个人被移动时,之前的转变让其他人决定像醉酒的水手一样漂流……;)
同样,很抱歉浪费你们的时间...:D 我早该知道先重置矩阵! :)
绝对不会。
你的代码有几个问题:
首先,您的 Start
和 Update
方法没有相同的 signature. You'll need them to have the same signature to use any sort of polymorphic behavior. Otherwise it's an overload not an override (and a hidden 方法。
其次,要使用派生的class方法,实例实际上必须是派生的class类型。
意思是,您必须持有 example
:
的一个实例
example e;
e.Start(/*whatever should be here*/);
或者使用多态Personality
来保存example
的一个实例:
Personality *p = new example();
p->Start(); // calls example's Start() in case it has a parameterless Start() method
梯子也可以做参考:
example e;
Personality &p = e;
p.Start(); // calls example's Start() in case it has a parameterless Start() method
当然,您可以在最后一个示例中调用 e.Start()
,但想法是这三行实际上可能位于代码的不同位置。
附带说明一下,您要求编译器执行的操作在逻辑上实际上是不可能的。
如果 FuzzyCode
依赖于基础 Personality
并且不依赖于派生的 example
任何方式,那么 example
中的更改是不可能的影响 FuzzyCode
.
现在,这个问题似乎已经被问过数百万次了,但我认为我的是个特例...
无论如何,我有这个 class:
class Personality {
public:
Personality() {};
virtual void Start () {
}
virtual void Update () {
}
virtual ~Personality() {};
};
我有这个覆盖版本:
class example : public Personality {
public:
example() {};
void Start (FuzzyGame::FuzzyObject& o);
void Update (FuzzyGame::FuzzyObject& o);
~example() {};
};
然后我有我的 GameObject class(又名 FuzzyObject):
class FuzzyObject {
public:
std::string name;
std::string tag;
std::string type;
FuzzyForm xform;
bool enabled = false;
std::string className;
Personality Pclass;
std::string path;
std::string texPath;
MD2Object animMesh;
bool isMD2;
LightData light;
CamData cam;
GLuint Texture;
BillboardType BBType;
};
我想知道的是:是否有可能从 example() class 调用一个方法,比如 Update(),使用这个基础实例 class,使用一些将它附加到("FuzzyObject")的 class 传递给该函数的方法?
Personality Pclass;
基本上,这就是我可以为我的游戏引擎创建基于 C++ 的脚本系统的全部内容。
更新: 通过阅读我批准的答案,我目前实际上正在使用这种方式:
example e;
e.Start(/*whatever should be here*/);
但我发现直接输入向量元素会导致段错误。我尝试了一个指向向量元素的指针,它起作用了。有点...任何人都知道为什么要像这样输入向量的元素:
example.Start(&myArray<FuzzyObject>[i]); //assuming this is in a for-loop
进入我的重载函数修改了我向量中的所有元素?!
又名。当 运行 更新一个对象(代码修改变换组件以将受影响的对象偏移 0.1)时,它也会偏移所有其他对象,这显然不是我想要的。有人知道这种奇怪行为的原因吗?
我只能假设问题的根源是一些奇怪的内存分配问题,只有 C++ 会出现...:D
更新 2: 我终于找到了我的另一个问题的根源(更新 1),这是真正愚蠢的事情,只会发生在 OpenGL 中......:D
事实证明它似乎在 std::vector 中修改整个 bang lot 的原因实际上根本不是向量指针;这是因为我忘记在绘制下一个对象之前加载单位矩阵!同样,当一个人被移动时,之前的转变让其他人决定像醉酒的水手一样漂流……;)
同样,很抱歉浪费你们的时间...:D 我早该知道先重置矩阵! :)
绝对不会。
你的代码有几个问题:
首先,您的 Start
和 Update
方法没有相同的 signature. You'll need them to have the same signature to use any sort of polymorphic behavior. Otherwise it's an overload not an override (and a hidden 方法。
其次,要使用派生的class方法,实例实际上必须是派生的class类型。
意思是,您必须持有 example
:
example e;
e.Start(/*whatever should be here*/);
或者使用多态Personality
来保存example
的一个实例:
Personality *p = new example();
p->Start(); // calls example's Start() in case it has a parameterless Start() method
梯子也可以做参考:
example e;
Personality &p = e;
p.Start(); // calls example's Start() in case it has a parameterless Start() method
当然,您可以在最后一个示例中调用 e.Start()
,但想法是这三行实际上可能位于代码的不同位置。
附带说明一下,您要求编译器执行的操作在逻辑上实际上是不可能的。
如果 FuzzyCode
依赖于基础 Personality
并且不依赖于派生的 example
任何方式,那么 example
中的更改是不可能的影响 FuzzyCode
.