派生类如何使用基类的protected成员?附代码示例
关于C++中派生类访问基类protected成员的问题
先把你给出的类定义和print函数实现整理成清晰的代码块:
#include <iostream> class A { public: A(int v) : value(v) { } protected: int value; }; class B : public A { public: B(int v) : A(v) { } void print() const; void compare_and_print(const A& other) const; }; void B::print() const { std::cout << "Value: " << value << "\n"; }
先聊print函数的合理性
这个函数完全没问题,它访问的是当前B对象自己从基类A继承来的protected成员value——按照C++的访问规则,派生类本来就有权访问自身实例里基类的protected成员,完全合法。
重点说compare_and_print函数的实现坑点
如果你想让B::compare_and_print对比当前对象的value和传入的other对象的value并打印,直接写other.value会编译报错!因为派生类只能访问自身实例中的基类protected成员,不能访问其他独立的基类(或派生类转基类)对象的protected成员,这是很多人容易踩的规则盲区。
给你几个可行的解决办法:
方案1:给基类A加public的getter方法(最推荐)
这是最符合封装原则的常规做法,把内部状态的访问权限交给基类自己管控:
class A { public: A(int v) : value(v) { } // 添加public getter方法 int get_value() const { return value; } protected: int value; }; // 对应的compare_and_print实现 void B::compare_and_print(const A& other) const { std::cout << "My value: " << value << ", Other value: " << other.get_value() << (value == other.get_value() ? " (equal)" : " (not equal)") << "\n"; }
方案2:让基类A声明B为友元
如果不想暴露public接口,可以让A直接授权B访问它的protected成员:
class A { // 声明B为友元类 friend class B; public: A(int v) : value(v) { } protected: int value; }; // 这样就能直接访问other的value了 void B::compare_and_print(const A& other) const { std::cout << "My value: " << value << ", Other value: " << other.value << (value == other.value ? " (equal)" : " (not equal)") << "\n"; }
方案3:给基类A加protected的getter方法
这种方式既不对外暴露public接口,又能让派生类合法访问:
class A { public: A(int v) : value(v) { } protected: int value; // 只给派生类开放的protected getter int get_protected_value() const { return value; } }; // B的compare_and_print实现 void B::compare_and_print(const A& other) const { int other_val = other.get_protected_value(); std::cout << "My value: " << value << ", Other value: " << other_val << (value == other_val ? " (equal)" : " (not equal)") << "\n"; }
内容的提问来源于stack exchange,提问作者Spiros
相关产品推荐
相关产品推荐

