C++含虚函数派生类问题:确保私有数组仅存小写字母
解决方法:通过重写protected虚函数实现私有成员的受控修改
嘿,这个问题其实很好解决!因为基类Something已经给我们留了关键的接口——那个protected的虚函数setValue,我们完全可以利用它来实现对私有数组FVect的字符范围控制,根本不需要修改基类代码。
核心思路
基类的setValue是protected且虚函数,这意味着:
- 派生类有权访问这个函数
- 我们可以在派生类中重写它,加入自己的校验逻辑,只有符合
<a-z>范围的字符,才会传递给基类的setValue去修改私有数组FVect
完整代码示例
#include <cctype> // 可选,用来更便捷地判断小写字母 class Something { private: char FVect[3]; protected: virtual void setValue(int _idx, char _val) { FVect[_idx] = _val; } public: Something() {}; }; // 派生类:实现字符范围控制 class ControlledSomething : public Something { protected: // 重写基类的setValue函数,加入校验逻辑 void setValue(int _idx, char _val) override { // 第一步:检查索引合法性,避免数组越界 if (_idx < 0 || _idx >= 3) { // 这里可以根据需求处理错误:比如抛出异常、打印日志,或者直接忽略 return; } // 第二步:检查字符是否在'a'到'z'范围内 if (_val >= 'a' && _val <= 'z') { // 符合条件,调用基类的setValue修改私有数组 Something::setValue(_idx, _val); } else { // 不符合条件的处理逻辑,示例:抛出异常提示错误 // throw std::invalid_argument("Character must be a lowercase letter between 'a' and 'z'"); } } public: // 给外部提供一个public的调用接口 void setControlledValue(int idx, char val) { setValue(idx, val); } };
为什么这样可行?
在C++的访问规则里,基类的私有成员FVect只能被基类自己的成员函数访问,而基类的setValue正好是具备这个权限的成员函数。我们的派生类通过重写setValue,先做范围校验,再调用基类的setValue间接修改FVect——这完全符合语法规则,而且不需要改动基类的任何代码。
额外提示
- 如果需要支持自动将大写转小写存储,可以在校验前加上
_val = std::tolower(_val);(记得包含<cctype>头文件) - 索引检查是必要的,能避免数组越界导致的未定义行为
- 对于不符合条件的字符,你可以根据业务需求选择忽略、打印警告或者抛出异常,让调用者明确知道错误情况
内容的提问来源于stack exchange,提问作者Karol Siegieda
相关产品推荐
相关产品推荐

