在这些评论之后,我必须将其添加到答案中。不要继承自QVector<T>
. 该类型没有虚拟析构函数,IS-A
在这种情况下继承()关系中最重要的东西将被破坏。
查看您的类符号,并想象您随着时间的推移增加了它的复杂性,所以现在您在某个地方有了析构函数和构造函数:
class Symbols: public QVector<Symbol>
{
~Symbols()
{
important_cleanup_here();
}
};
您可能认为这Symbols
是 的子类型QVector<Symbol>
,因此您的一个客户会这样写:
QVector<Symbol>* symbols = new Symbols();
听起来不错,对吧?毕竟Symbols
extends QVector<Symbol>
,所以它可以遵循替代原则,对吧?错误的。因为QVector<T>
析构函数不是虚拟的,所以这不会调用Symbols
析构函数!
delete symbols;
更糟糕的是,这是未定义的行为,编译器可以随心所欲。
如果您只想要方便的方法,请创建一个可以为您解决问题的非方法
QSymbol findSymbol(const QVector<QSymbol>&, const QString& name);
(有关这方面的参考,请阅读这篇令人惊叹的 Scott Meyer 的文章:http ://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197 )
当然,在你的例子中,没有什么好害怕的。但是,当您可以毫无畏惧地使用作文时,为什么要给您的一个班级带来如此沉重的负担呢?
此外,请参阅此(以及其他少数几个)报告的错误:https ://bugreports.qt.io/browse/QTBUG-8292
除了所有其他问题,我可以在这里看到一个:
class Symbols: public QVector<Symbol>
{
QSymbol findSymbol(const QString &name);
};
根据我所看到的,它应该是
class Symbols: public QVector<Symbol>
{
Symbol findSymbol(const QString &name);
};
或者
class Symbols: public QVector<QSymbol>
{
QSymbol findSymbol(const QString &name);
};