Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可能以某种方式将基类指针强制转换为未知子类?_C++_Templates_Casting_Multiple Inheritance - Fatal编程技术网

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();
};