C++ 在函数外使用基类指针

Posted

技术标签:

【中文标题】C++ 在函数外使用基类指针【英文标题】:C++ Using base class pointers outside of function 【发布时间】:2016-06-14 02:13:32 【问题描述】:

我有一个基类和几个派生类。之前我使用一个容器来管理一个对象,但现在我可以在这种情况下拥有几种不同类型的学生,这意味着我决定使用基类指针来管理它。但是我不确定如何在创建它的函数之外处理对象。以下是我之前为管理对象所做的。有没有类似用基类指针管理容器的东西?

 pointer = new SchoolChild[NoOfChildren];//creates pointer that free up space on memory

 for (int i = 0; i < NoOfChildren; i++)

    pointer[i].display();

【问题讨论】:

这只是创建一个数组来存储您的 SchoolChild 对象指针。将其更改为基类,然后您将拥有一个基指针数组。在其他地方,您需要将新的 SchoolChild 对象和任何其他派生类型设置到基本指针数组中。这需要在您尝试在每个数组条目上调用 display() 之前发生,否则它会尝试在 NULL 上调用 display() 方法。 【参考方案1】:

通常,您会从管理 数组 转移到 指针数组

// from this (pointer to SchoolChild)
SchoolChild* children = new SchoolChild[NoOfChildren];

children[0].name = "name";


// to this (pointer to SchoolChild pointer)
SchoolChild** children = new SchoolChild*[NoOfChildren];

children[0] = new SchoolChild; // allocate each element
children[0]->name = "name";

您还有更多的删除工作要做,需要删除数组的每个元素以及数组本身。

for(int i = 0; i < NoOfChildren; ++i)
    delete children[i]; // delete each element
delete[] children; // delete[] the array itself

最好使用 容器智能指针 为您管理所有这些:

std::vector<std::unique_ptr<SchoolChild>> children(NoOfChildren);

children[0]->name = "name";

这里不需要删除任何内容,因为std::unique_ptrs 将删除包含的SchoolChild 对象,而std::vector 将删除std::unique_ptr 元素。

【讨论】:

以上是关于C++ 在函数外使用基类指针的主要内容,如果未能解决你的问题,请参考以下文章

C++学习_多态

在 C++ 中将指向基类的指针传递给派生类的成员函数

C++中的指针数组

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

如何从指向基类类型的指针调用派生类函数(C++)