子类化时重写静态变量,仅通过基类单个访问器实现的可行方案问询
无需重写
getA的静态成员继承方案 针对你提出的需求,可以利用**C++奇异递归模板模式(CRTP)**结合静态成员的继承查找规则来实现,完全不需要在每个派生类中重写getA函数。
核心实现代码
#include <vector> // CRTP基类模板,绑定派生类类型 template <typename Derived> class B { public: static const std::vector<int>& getA() { // 利用名称查找规则:优先取Derived的a,没有则向上遍历继承链 return Derived::a; } }; // 顶层基类特化,提供默认的静态成员a class BaseB : public B<BaseB> { public: static const std::vector<int> a; }; // 初始化默认a的值 const std::vector<int> BaseB::a = {0, 1, 2}; // 自定义a的派生类 class D1 : public B<D1> { public: static const std::vector<int> a; }; const std::vector<int> D1::a = {3, 4, 5}; // 未自定义a的派生类,自动继承D1的a class D2 : public B<D2>, public D1 {}; // 直接继承顶层基类,使用默认a class D3 : public BaseB {};
调用示例
#include <iostream> int main() { // 输出D1的a:3 4 5 for (int n : D1::getA()) std::cout << n << " "; std::cout << "\n"; // 输出D2的a(继承D1):3 4 5 for (int n : D2::getA()) std::cout << n << " "; std::cout << "\n"; // 输出D3的a(默认值):0 1 2 for (int n : D3::getA()) std::cout << n << " "; std::cout << "\n"; return 0; }
工作原理
- CRTP绑定派生类:基类模板
B<Derived>通过模板参数直接关联到派生类,getA中直接访问Derived::a,无需额外重写。 - 静态成员自动查找:C++编译器会优先查找派生类自身的静态成员
a,如果未定义,则沿着继承链向上查找最近的父类的a,自动满足“未定义则用层级中最底层父类的a”的需求。 - 低维护成本:仅需在需要自定义
a的类中声明并初始化静态成员即可,其余派生类无需任何额外代码,完美适配庞大的类层级结构。
内容的提问来源于stack exchange,提问作者sancho.s ReinstateMonicaCellio
相关产品推荐
相关产品推荐

