可能以某种方式将基类的指针转换为未知的子类?

时间:2013-06-17 23:38:22

标签: c++ templates casting multiple-inheritance

方案

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.

&amp; ...代表获取地址,C ++标准术语可能将对象定义为已经是地址,在这种情况下&amp; ...是对象本身

此时subClassXObject的类是未知的,它可以是BaseClass的任何已定义的子类。

众所周知,它是BaseClass的直接派生子类之一,它们也都从Instance&lt; subClassX&gt;继承而来。其中subClassX是BaseClass的直接派生子类的名称。

实例&LT; subClassX&GT;继承自BaseInstance。 BaseInstance定义了一个公共纯虚函数,Instance&lt; subClassX&gt;实现,它的名字是getDescriptor。

因此,每个subClassObject都可以访问getDescriptor。

SubClassX* pointer = &subClassXObject;
pointer->getDescriptor();               // This should work

(或者不是吗?现在我很尴尬:我是否必须在子类中显式实现基类公共方法,以便有人能够从外部调用子类?不...,避难所&# 39; t I?)。

我喜欢

BaseClass* pointer = &subClassXObject;
pointer->getDescriptor();

工作。

从BaseInstance和Instance&lt; subClassX&gt;移动getDescriptor到BaseClass和每个子类是可能的,但我希望我的BaseClass的用户只编写应用程序逻辑代码,而不是基础设施代码(即使他们只需要返回Instance&lt; subClassX&gt;方法返回值)。这背后的想法是创建一个对象浏览器,每个子类实例化的对象都被馈送和列出,而用户不必添加任何非类目的代码。

将指针强制转换为BaseInstance *会导致应用程序崩溃。因此我的问题在标题中表达。

感谢您的关怀!

2 个答案:

答案 0 :(得分:0)

只需使用虚拟关键字在基类中定义函数,右边的派生类就会自动拾取。

class Base{
public:
virtual int getDescriptor();
};

答案 1 :(得分:0)

将BaseClass *指针声明为BaseInstance *指针。然后演员不是必要的,而且有效。

您只能使用BaseInstance方法,然后转换为BaseClass *会崩溃。由于这些方法是从对象浏览器中使用的,这是关于基础结构函数,它们在BaseInstance中比在BaseClass中更有意义,因此无法使用BaseClass方法(BaseClass最好只包含基本应用程序逻辑方法)。