【发布时间】:2019-12-18 15:34:41
【问题描述】:
我正在尝试创建一个存储 SubClass 对象的 BaseClass 数组。以下是我用来执行此操作的以下步骤:
- 我创建了一个 BaseClass 数组。
- 我创建了一个新的 SubClass 对象以存储在数组中。
- 我调用数组中该对象的 printSelf() 函数。
- 该方法错误地调用了 BaseClass 函数,而不是 SubClass 函数。
这里的错误是BaseClass数组中存储的对象是BaseClass对象。我需要它以便 BaseClass 数组存储一个 SubClass 类型的对象。
问题的设计使得如果有多个子类(即 SubClassA、SubClassB、SubClassC...),它们都将存储在一个数组中。
我在 StackOverFlow 上尝试了各种其他解决方案。到目前为止,还没有一个解决方案来解释为什么创建 SubClass 对象不会将其类类型正确地存储在 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;
}
我希望输出是“这个元素是一个子类”。
相反,我收到的输出是“这个元素是一个 BaseClass。”
【问题讨论】:
-
C++ 不能以这种方式工作。这称为“对象切片”。这就是对象在 Java 中的工作方式,但 C++ 不是 Java。有关更多信息,请参阅重复的问题。您将派生类,子类,数组中的值分配给基类。这会切掉派生类,将基类留在数组中。如果您只是将一个普通的派生类对象分配给一个普通的基类对象,也会发生同样的事情。
标签: c++ arrays parent-child subclass base-class