所以这可能是一个奇怪的问题,但我有充分的理由问这个问题。
我的问题的要点是,给出一个在类层次结构上有两个派生级别的示例:
主要基类:
class Animal
{
virtual void Draw() = 0;
};
派生类:
class Dog : public Animal
{
virtual void Draw()
{
// draw a generic dog icon or something...
}
};
进一步推导:
class Corgi : public Dog
{
virtual void Draw()
{
// draw a corgi icon...
}
};
现在,我希望能够从Corgi
类中永久地将“this”指针向下转换为Dog
指针,然后将其作为 Animal 传递到其他地方。然后这个其他地方将能够调用Draw
函数并获取Dog
方法,而不是虚拟Corgi
方法。我知道这很奇怪,但同样,我有一个模糊的正当理由想要这样做。
我已经尝试了所有不同的铸造操作员并且没有任何运气,但也许有一种一致的方法可以解决这个问题?过去,我因未正确使用而给自己造成了麻烦,dynamic_cast
这导致指针的类似状态。也许这一次我可以利用它来发挥我的优势?
编辑: 也许上面的例子并没有清楚地说明我想要达到的目标,所以我会详细说明我的真正目标。
我正在尝试实现注册基类实现的简写,这些实现链接到我已经使用了一段时间的脚本系统。脚本系统依赖于一个基类IScriptContext
方便访问真实代码函数和成员变量访问。基类在内部注册它们的成员函数地址和成员变量地址,稍后通过查找表分派/访问这些地址。我正在为脚本系统添加对类派生层次结构的适当支持,我认为能够隔离这些接口的基类版本将有助于节省时间并使整个过程对我来说更清晰使用脚本解释器注册可用的基类。还有其他方法可以实现这一点,例如为每个可用基类的每个所需方法注册类特定函数指针(例如this->Dog::CallFunction
,this->Dog::SetMember
this->Dog::GetMember
.) 但是,如果我需要的话,我认为使用界面可以让我在以后更轻松地修改事情。
我希望所有这些都有意义。
谢谢!