C++ 是否可能以某种方式将基类指针强制转换为未知子类?
场景:C++ 是否可能以某种方式将基类指针强制转换为未知子类?,c++,templates,casting,multiple-inheritance,C++,Templates,Casting,Multiple Inheritance,场景: BaseClass* pointer = &subClassXObject; // subClassXObject is object of class subClassX // which is derived from BaseClass and // Instance<subClassX>. (In
BaseClass* pointer = &subClassXObject; // subClassXObject is object of class subClassX
// which is derived from BaseClass and
// Instance<subClassX>. (Instance<subClassX> is
// for counting instances of type subClassX.)
// Instance<subClassX> is derived from
// BaseInstance.
(或者不是吗?现在我正在纠结:我是否必须在子类中显式实现基类公共方法,以便有人能够从外部调用该子类?不,不是吗?)
我喜欢
BaseClass* pointer = &subClassXObject;
pointer->getDescriptor();
工作
可以将getDescriptor从BaseInstance和Instance移动到BaseClass和每个子类,但是我希望基类的用户只编写应用程序逻辑代码,而不是基础结构代码(即使他们只需要返回实例方法返回值)。这背后的想法是创建一个对象浏览器,用户无需添加任何非类用途的代码,即可将实例化对象的每个子类输入并列出
将指针强制转换为BaseInstance*会使应用程序崩溃。因此,我的问题如标题所述
谢谢你的关心 只要在基类中用虚关键字定义函数,就会自动拾取正确的派生类
class Base{
public:
virtual int getDescriptor();
};
将BaseClass*指针声明为BaseInstance*指针。那么,不需要强制转换,它可以工作
您只能使用BaseInstance方法,因为对BaseClass*的转换将崩溃。由于这些方法是从对象浏览器中使用的,这是关于基础结构功能的,它们在BaseInstance中比在BaseClass中更有意义,因此不能使用BaseClass方法是可以的(BaseClass最好只包含基本应用程序逻辑方法)。问题的标题是“…将基类指针转换为未知子类…”. 问题的文本描述了一个相反方向的强制转换:从子类到基类。那么,您希望向哪个方向强制转换?它可能更像是跨类强制转换:从基类到基类实例,因为我不知道子类X。我发现在没有RTTI的代码中它是不可确定的(我不想触及RTTI),因此我删除了最后一段。也许某种类型的实例填充可以实现可确定性?我不明白:子类X和基类一样都是BaseInstance的子类——甚至更重要的是,BaseInstance是第一个。如果虚拟函数表适用于BaseClass*,那么它应该同样适用于BaseInstance*。如果从一开始就声明为BaseInstance,那么它应该可以工作。如果是这样,为什么应用程序在转换后会崩溃?当subclass从一开始就声明为BaseInstance*时,应用程序会工作。为什么演员会崩溃??(如果我可以交换声明,强制转换应该可以工作吗?)。将所有内容移动到基类和子类X会起作用,但正如我所写的,我不想这样做。
class Base{
public:
virtual int getDescriptor();
};