c++ - 继承与实例

标签 c++ inheritance 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 .

我的想法是否正确,或者这两个版本之间是否存在本质区别?

最佳答案

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

如果客户端代码使用了 vector 的某些部分界面,后来更改为 MyVector比如决定它应该将数据存储在 map 中, 或者它不能让客户端代码 clear() vector如果不调用其他函数,则必须相应地审查和更新所有客户端代码。如果您只是在编写一个小程序,这可能不是什么大问题,但如果 MyVector在很多其他人使用的库中 - 特别是如果他们很难联系、协调或激励他们更新他们的代码,那么这是非常不受欢迎的。

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

与此相反,您作为 MyVector 的实现者|让它提供一个功能齐全的std::vector界面毫不费力。

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

这些是需要考虑的因素 - 没有硬性的正确或错误答案,只有经验可以指导在哪里画线....

关于c++ - 继承与实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24820680/

相关文章:

python - Python中的继承有什么意义?

Java外部类扩展静态内部类

python - 仅当传递的参数是字符串时,如何才能实例化类?

javascript - 在 Node.js 中创建模块的副本而不是实例

iphone - 如何调用另一个类的方法?

c++ - 在 C++ DLL 实例之间共享对象

c++ - 将多个 void* 复制到一个 vector 中

c++ - OpenCL:指令和地址之间的状态空间不匹配

c++ - 在 C++ 中使用迭代器导航 map

java - 如何只实现抽象类的某些方法?