gpt4 book ai didi

c++ - 从具有非虚拟析构函数的容器继承

转载 作者:行者123 更新时间:2023-11-28 08:30:56 26 4
gpt4 key购买 nike

我正在尝试使用前向声明和 d 指针来消除一些包含依赖项。一切都运行良好,除了我在许多地方使用 XList typedef 来提高可读性(例如:typedef QList<X> XList)。

typedef 前向声明问题的解决方法是使用继承:class XList : public QList<X>{}; .QList 有一个非虚析构函数。鉴于Qt自己的QStringList继承了QList<QString>而且我没有在堆上分配 XList,您是否发现此解决方法有任何问题?我是否应该明确禁止 XList 类的堆分配?

最佳答案

让我们看看如果我们定义 XList 会发生什么这样:

class XList : public QList<X> {};

以下将按预期工作:

  XList* x = new XList;
delete x;

但是以下不会:

  QList<X>* q = new XList;
delete q;

QList<X>的析构函数将被调用但不会被调用 XList的,如果有的话。这就是基类中的虚拟析构函数将为您执行的操作。

如果您从不使用堆分配,您应该没问题,但是您正在为跟随您的维护者(甚至是您自己几个月后)准备一个陷阱。

确保将此假设记录在案并制作XListnew operator private 以防止您提到的堆实例化。

安全的替代方法是制作 QList<X>你的成员XList ,即:更喜欢封装而不是继承。

关于c++ - 从具有非虚拟析构函数的容器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148970/

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