我正在尝试使用前向声明和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
的析构函数将被调用。这就是基类中的虚拟析构函数将为您完成的工作。如果您从不使用堆分配,那应该没问题,但是您正在为后续的维护者(甚至几个月内自己)准备一个陷阱。
确保记录了该假设,并使
XList
的new
运算符私有,以防止您提到的堆实例化。安全的替代方法是使
QList<X>
成为XList
的成员,即:与继承相比,更喜欢封装。关于c++ - 从具有非虚拟析构函数的容器继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2148970/