gpt4 book ai didi

c++ - 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:53 31 4
gpt4 key购买 nike

我正在尝试以下示例:

class base // base class
{
public:
std::list<base*> values;
base(){}
void initialize(base *b) {
values.push_front(b);
}
virtual ~base()
{
values.clear();
cout<<"base called"<<endl;
}
};

class derived : public base // derived class
{
public:
~derived(){
cout<<"derived called"<<endl;
}

};

int main()
{
derived *d = new derived;
base *b = new base;
b->initialize(static_cast<base *>(d)); /* filling list */
delete b;
return 0;
}

Q.1) 为什么派生类的析构函数没有被调用,因为在基类析构函数中我正在执行 values.clear()

Q.2) 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

最佳答案

Q1。因为您没有删除 derived 类型的对象。您只需执行 delete b;,这会删除一个 base。您还应该调用 delete d;

此外,您应该指定负责内存管理的对象。你的设计很容易出错。您最好使用智能指针来防止歧义。此外,要表现得像期望的那样,析构函数应该是:

virtual ~base()
{
for ( int i = 0 ; i < values.size() ; i++ )
delete values[i];
values.clear();
cout<<"base called"<<endl;
}

当然,使用这种方法,在您的 main 中调用 delete d; 将是未定义的行为。

Q2。不,不需要定义。

关于c++ - 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279183/

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