You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

派生类如何使用基类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:33:45