C++如何创建继承二维vector的自定义类并添加自定义方法
问题解答
你描述的实现方式语法层面可以正常运行,但不符合C++工程开发规范,不建议在生产环境使用,具体说明如下:
可运行的依据
std::vector未被声明为final类,公开继承的语法完全合法。只要补全类定义的语法细节(比如继承基类构造函数、补全自定义方法实现),你示例中的赋值操作、自定义方法调用、vector原生方法调用都可以正常执行,参考可运行的完整实现:
#include <vector> #include <algorithm> #include <random> using matrix = std::vector<std::vector<float>>; class MyClass : public matrix { public: // 继承matrix的所有构造函数 using matrix::matrix; // 自定义随机打乱方法示例 void randomize() { std::random_device rd; std::mt19937 gen(rd()); for (auto& row : *this) { std::shuffle(row.begin(), row.end(), gen); } } }; int main() { MyClass m; m = {{1,2,3}, {4,5,6}, {7,8,9}}; m.randomize(); // 自定义方法正常生效 m.pop_back(); // vector原生方法正常调用 return 0; }
不推荐的核心原因
std::vector没有虚析构函数,当你用基类指针指向子类对象并销毁时,会触发未定义行为,子类部分的资源不会被正确释放,存在内存泄漏风险:
风险代码示例:
matrix* ptr = new MyClass(); delete ptr; // 仅调用matrix的析构函数,子类资源泄漏
- STL容器的设计目标就不是被继承使用,没有针对继承场景做任何兼容设计,后续开发中很容易出现对象切片、隐式类型转换导致的意外bug,维护成本极高。
更稳妥的替代实现
推荐用组合而非继承的方式封装矩阵能力,完全规避上述风险:
#include <vector> #include <initializer_list> using matrix = std::vector<std::vector<float>>; class MyClass { private: matrix data; public: // 封装需要用到的vector原生方法 void pop_back() { data.pop_back(); } size_t row_count() const { return data.size(); } // 重载下标运算符方便访问元素 std::vector<float>& operator[](size_t row_idx) { return data[row_idx]; } const std::vector<float>& operator[](size_t row_idx) const { return data[row_idx]; } // 支持初始化列表赋值 MyClass& operator=(std::initializer_list<std::vector<float>> init_list) { data = init_list; return *this; } // 自定义方法 void randomize() { // 自定义逻辑直接操作内部data即可 } };
这种实现行为完全可控,是工业界的通用方案。
内容的提问来源于stack exchange,提问作者Jonatha Rihan
相关产品推荐
相关产品推荐

