方案:
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 *会导致应用程序崩溃。因此我的问题在标题中表达。
感谢您的关怀!
答案 0 :(得分:0)
只需使用虚拟关键字在基类中定义函数,右边的派生类就会自动拾取。
class Base{
public:
virtual int getDescriptor();
};
答案 1 :(得分:0)
将BaseClass *指针声明为BaseInstance *指针。然后演员不是必要的,而且有效。
您只能使用BaseInstance方法,然后转换为BaseClass *会崩溃。由于这些方法是从对象浏览器中使用的,这是关于基础结构函数,它们在BaseInstance中比在BaseClass中更有意义,因此无法使用BaseClass方法(BaseClass最好只包含基本应用程序逻辑方法)。