繁体   English   中英

继承与实例

[英]Inheritance vs. instance

我想创建一个类,该类应该能够保存各种数字以及其他一些数据,例如数据集的名称。 为了保存数字,我选择了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

我的想法是对的还是这两个版本之间有本质区别?

因为基类是公共的,所以使用MyVector代码可能会对它做任何事情,例如erasepush_back元素, std::sort它,保留它的迭代器,甚至在MyVector做一些使它们无效的操作后也可以尝试使用的迭代器。 。

如果客户端代码使用了vector接口的某些部分,并且后来对MyVector了更改,例如确定它应该将数据存储在map ,或者它不让客户端代码在不调用其他函数的情况下将vector clear()vector ,那么所有客户代码将必须进行相应的审查和更新。 如果您只是编写一个小程序,可能不会感到很痛苦,但是如果MyVector位于许多其他人使用的库中-尤其是在他们难以联系,协调或激励他们更新代码的情况下,那就太不可取了。

如果MyVector的可靠操作需要对数据上允许的操作进行某种控制(例如,需要确保它们始终保持排序,始终小写或没有重复等),则向客户端代码授予该功能在MyVector无法拦截和验证这些更改的情况下更改数据是不可取的。

与此MyVector ,作为MyVector的实现者,您可以MyVector地提供功能齐全的std::vector接口。

当以MyVector为基础时,必须确保客户端代码永远MyVector使用std::vector<int>* delete sa MyVector (无论如何,这种情况看起来极不可能,但是对于通常通过基类指针存储的类型,它可以是一个很大的风险)。

这些就是要考虑的因素-没有正确或错误的答案,只有经验可以指导界限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM