如何在 BaseClass 指针数组中存储指向 SubClass 对象的指针?

How to store a pointer to SubClass object in a BaseClass pointer array?

我正在尝试创建一个存储 SubClass 对象的 BaseClass 数组。以下是我用来执行此操作的以下步骤:

  1. 我创建了一个 BaseClass 数组。
  2. 我创建一个新的 SubClass 对象存储在数组中。
  3. 我在数组中调用该对象的 printSelf() 函数。
  4. 该方法错误地调用了 BaseClass 函数,而不是 SubClass 函数。

这里的错误是BaseClass数组中存储的对象是一个BaseClass对象。我需要它以便 BaseClass 数组存储一个 SubClass 类型的对象。

问题的设计使得如果有多个子类(即 SubClassA、SubClassB、SubClassC...),它们将全部存储在一个数组中。

我在 Whosebug 上尝试过各种其他解决方案。 None 到目前为止已经提供了一个解决方案,说明为什么创建 SubClass 对象不会将其 class 类型正确存储在 BaseClass 数组中。

class BaseClass {
    public: void printSelf() { cout << "This element is a BaseClass." << endl; };
};

class SubClass : public BaseClass {
    public: void printSelf() { cout << "This element is a SubClass." << endl; };
};

class House {
    public: House();
    private: BaseClass* subClassArray[1];
};

House::House() {
    subClassArray[0] = new SubClass;
    subClassArray[0]->printSelf();
}

int main() {
    House houseMain;
}

我希望输出是 "This element is a SubClass."

相反,我收到的输出是 "This element is a BaseClass."

问题是您隐藏了 printSelf 方法,而不是覆盖它。因此,当您有一个指向基本 class 类型的指针时,将使用 printSelf 的基本 class' 版本。

有两种方法可以解决这个问题,要么将 subClassArray[0] 转换为 subclass 类型(不推荐,除非您不拥有基础 class)或者您将 printSelf 标记为虚拟并在 subclass.

中覆盖它

您需要将 printSelf 声明为 虚拟 。此外,您几乎肯定想向 class.

添加一个虚拟析构函数
class BaseClass {
    public: virtual void printSelf() const { cout << "This element is a BaseClass." << endl; };
            ////// <- must           ///// <- recommended
            virtual ~BaseClass() = default; // <-- HIGHLY recommended
};

class SubClass : public BaseClass {
    public: void printSelf() const override { cout << "This element is a SubClass." << endl; };
                                   //////// <- recommended
};

下一行有两次问题。

private: BaseClass* subClassArray[1];

首先,它使用原始的 C 风格指针。其次,它使用原始的 C 风格数组。在今天的 C++ 开发中都不推荐使用这两种方法。您想了解智能指针,std::vectorstd::array

不要在这里使用任何强制转换,这是一个不可选项。