如何在 BaseClass 指针数组中存储指向 SubClass 对象的指针?
How to store a pointer to SubClass object in a BaseClass pointer array?
我正在尝试创建一个存储 SubClass 对象的 BaseClass 数组。以下是我用来执行此操作的以下步骤:
- 我创建了一个 BaseClass 数组。
- 我创建一个新的 SubClass 对象存储在数组中。
- 我在数组中调用该对象的 printSelf() 函数。
- 该方法错误地调用了 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::vector
和 std::array
。
不要在这里使用任何强制转换,这是一个不可选项。
我正在尝试创建一个存储 SubClass 对象的 BaseClass 数组。以下是我用来执行此操作的以下步骤:
- 我创建了一个 BaseClass 数组。
- 我创建一个新的 SubClass 对象存储在数组中。
- 我在数组中调用该对象的 printSelf() 函数。
- 该方法错误地调用了 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::vector
和 std::array
。
不要在这里使用任何强制转换,这是一个不可选项。