如何将基类的特定重载方法导入派生类的私有作用域?
针对单个方法重载调整访问作用域的正确做法
结论:不能直接通过using声明指定参数类型来选择单个重载方法,但可以通过其他合法方式实现对特定重载的访问权限控制
你给出的示例代码存在语法错误:using base::something_else(bool);这种写法不符合C++规范——using声明引入基类成员时,只能指定成员名称,不能附带参数列表或返回值类型。如果写using base::something_else;,会把基类中所有同名的something_else重载版本都引入到当前访问控制块的作用域中。
以下是两种实现单个重载访问控制的常用方法:
方法1:包装目标重载
在派生类中重新定义需要调整权限的重载,内部调用基类版本,同时指定所需的访问修饰符:
#include <iostream> class base { public: void print() { std::cout << "Hello World" << std::endl; } void something_else(int) { std::cout << "Hello int stuff" << std::endl; } void something_else(bool) { std::cout << "Hello bool stuff" << std::endl; } }; class derived : public base { public: // 公开bool版本,复用基类实现 void something_else(bool val) { base::something_else(val); } private: // 私有int版本,复用基类实现 void something_else(int val) { base::something_else(val); } }; int main() { derived d; d.print(); // d.something_else(2); // 编译错误:该方法为private d.something_else(true); // 正常调用 }
方法2:引入重载集后隐藏/禁用目标版本
先通过using引入所有重载到派生类的某个访问域,再重新定义不需要的重载并设置为私有,或直接删除该重载:
#include <iostream> class base { public: void print() { std::cout << "Hello World" << std::endl; } void something_else(int) { std::cout << "Hello int stuff" << std::endl; } void something_else(bool) { std::cout << "Hello bool stuff" << std::endl; } }; class derived : public base { public: using base::something_else; // 引入所有重载到public域 private: // 直接禁用int版本,编译期拦截调用 void something_else(int) = delete; }; int main() { derived d; d.print(); // d.something_else(2); // 编译错误:该重载已被删除 d.something_else(true); // 正常调用 }
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

