1

场景

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++ 标准术语可能将 object 定义为已经是地址,在这种情况下 &... 是对象本身

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

众所周知,它是 BaseClass 的直接派生子类之一,每个子类也继承自 Instance<subClassX>,其中 subClassX 是 BaseClass 的直接派生子类的名称。

Instance<subClassX> 继承自 BaseInstance。BaseInstance 定义了一个由 Instance<subClassX> 实现的公共纯虚函数,它的名字叫 getDescriptor。

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

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

(或者不是吗?现在我很困惑:我是否必须在子类中显式实现基类公共方法,以便有人能够从外部调用子类?不......,不是吗? )。

我喜欢

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

去工作。

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

将指针转换为 BaseInstance* 会使应用程序崩溃。因此,我的问题如标题中所述。

感谢您的关心!

4

2 回答 2

0

将 BaseClass* 指针声明为 BaseInstance* 指针。然后不需要演员表并且它可以工作。

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

于 2013-06-18T12:27:24.480 回答
0

只需在基类中用 virtual 关键字定义函数,就会自动提取正确的派生类。

class Base{
public:
virtual int getDescriptor();
};
于 2013-06-18T01:05:50.923 回答