以某种方式将基类的指针强制转换为未知子类

casting pointer of base class to unknown subclass possible somehow?

本文关键字:转换 子类 未知 指针 方式 基类      更新时间:2023-10-16

>场景

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.

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

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

众所周知,它是 BaseClass 的直接派生子类

之一,每个子类也继承自 Instance其中 subClassX 是 BaseClass 的直接派生子类的名称。

Instance

继承自 BaseInstance。BaseInstance 定义了一个公共纯虚拟函数,Instance 实现了它,它的名字是 getDescriptor。

因此,每个子类对象都可以访问getDescriptor。

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

(还是不是?现在我遇到了问题:我是否必须在子类中显式实现基类公共方法,以便有人能够从外部对子类调用它?不...,不是吗?

我喜欢

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

去工作。

可以将getDescriptor从BaseInstance和Instance

移动到BaseClass和每个子类,但是我希望BaseClass的用户只编写应用程序逻辑代码,而不是基础结构代码(即使他们只需要返回Instance方法返回值(。这背后的想法是创建一个对象浏览器,其中每个子类实例化的对象都被馈送到并列出,而无需用户添加任何非类目的代码。

强制转换为指向 BaseInstance* 的指针会使应用程序崩溃。因此,我的问题在标题中措辞。

感谢您的关心!

只需使用 virtual 关键字定义基类中的函数,右派生类将自动拾取。

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

将 BaseClass* 指针声明为 BaseInstance* 指针。然后不需要石膏,它可以工作。

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