我想创建一个类,该类应该能够保存各种数字以及其他一些数据,例如数据集的名称。为了保存数字,我选择了std::vector<int>
,但现在我想知道从它继承还是在类中创建一个实例是更好的选择:
class MyVector : public std::vector<int> {
private:
std::string name;
public:
MyVector (std::string name)
: std::vector<int>(0), name(name)
{}
与
class MyVector {
private:
std::string name;
public:
std::vector<int> data;
MyVector (std::string name)
: data(std::vector<int>(0)), name(name)
{}
我首选第一个,因为我摆脱了多余的字段
data
,因此可以直接调用std::vector
的内置方法,而无需使用中间data
。我的想法是对的还是这两个版本之间有本质区别?
最佳答案
因为基类是公共(public)的,所以使用MyVector
的代码可能会对它做任何事情,例如erase
或push_back
元素,对其进行std::sort
保留它的迭代器,即使MyVector
做了一些使它们无效的操作,它也可能尝试使用它。
如果客户端代码使用了vector
接口(interface)的某些部分,并且稍后对MyVector
进行了更改,例如决定应将数据存储在map
中,或者不允许客户端代码在不调用其他函数的情况下让clear()
成为vector
,则所有客户端代码必须进行相应的审查和更新。如果您只是编写一个小程序,可能不会感到很痛苦,但是如果MyVector
位于许多其他人使用的库中-尤其是在他们难以联系,协调或激励他们更新代码的情况下,那就太不可取了。
如果MyVector
的可靠操作需要对数据上允许的操作进行某种控制(例如,需要确保它们始终保持排序,始终小写或没有重复等),则向客户端代码授予该功能在没有MyVector
能够拦截和验证那些更改的情况下更改数据是不可取的。
与此相反,作为MyVector
的实现者,您可以毫不费力地提供一个功能齐全的std::vector
接口(interface)。
当以MyVector
为基础时,必须确保客户端代码永远不要使用delete
成为MyVector
(无论如何在这种情况下似乎都不太可能,但是对于经常通过基类指针存储的类型来说,这可能是一个很大的风险)。
这些都是要考虑的因素-没有正确或错误的答案,只有经验可以指导界限。
关于c++ - 继承与实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24820680/