gpt4 book ai didi

c++ - 如何在另一个类的 vector 中调用派生类的析构函数

转载 作者:行者123 更新时间:2023-11-30 05:12:29 25 4
gpt4 key购买 nike

我有一个类,它有一个 std::vector 指针,指向一个具有不同派生类的基类。如何从 vector 类中调用它们的析构函数?

持有人.h

class holder
{
public:
void add_stuff();
void do_stuff();
private:
std::vector<base*> vect;
};

持有人.cpp

void holder::add_stuff(base* to_add) {
vect.push_back(to_add);
}

void holder::do_stuff() {
vect[0]->say_words();
delete vect[0]; //<--<--<-- I want to delete the object now
}

如果您知道我做错了什么,请随时停下来。我已经包括了其余代码的基本内容,以防我离题太远。

基础.h

class base
{
public:
base();
virtual ~base();
virtual void say_words() = 0;
};

派生.h

class derived : public base
{
public:
derived();
~derived();
void say_words();
};

派生.cpp

derived::derived() {}
derived::~derived() {}

void derived::say_words() {
cout << "Words!" << endl;
}

主要.cpp

holder hold;
holder* H = &hold;
int main(){
base* d = new derived();
H->add_stuff(d);
H->do_stuff();
}

最佳答案

How do I call their destructors from within the vector class?

你已经是了,因为 ~base 析构函数被标记为 virtual。在指向基类的指针上调用 delete 将自动为您调用所有派生的析构函数。这就是为什么首先需要将基类析构函数声明为virtual

不过,您缺少的是在您删除对象后从std::vector中删除对象指针,例如:

void holder::do_stuff() {
vect[0]->say_words();
delete vect[0]; // <-- calls all destructors of this object!
vect.erase(vect.begin()); // <-- add this line!
}

您不想在您的容器中留下无效的指针。

关于c++ - 如何在另一个类的 vector 中调用派生类的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com