是的,完全可以。
这是 protected 访问修饰符的核心设计目的。
详细解释
在C++继承中,protected 成员扮演着一个特殊的角色:它对“外界”是隐藏的,但对“自家人”(即派生类)是开放的。
当一个派生类通过 public 继承(或 protected、private 继承)基类时:
基类的 public 成员在派生类中保持其访问级别(public)。
基类的 protected 成员在派生类中也保持其访问级别(protected)。
基类的 private 成员对派生类不可访问。
因此,派生类可以直接访问基类的 protected 成员变量和成员函数,就像访问自己的成员一样。
示例代码
深色版本
#include <iostream>
#include <string>
class Animal {
protected: // 关键:使用 protected
std::string name;
int age;
// protected 成员函数
void log(const std::string& message) const {
std::cout << "[" << name << "]: " << message << std::endl;
}
public:
Animal(const std::string& n, int a) : name(n), age(a) {
log("Animal created");
}
// 虚函数,用于多态
virtual void makeSound() const = 0; // 纯虚函数,使 Animal 成为抽象类
};
// Dog 通过 public 继承 Animal
class Dog : public Animal {
private:
std::string breed;
public:
// 构造函数,初始化基类部分
Dog(const std::string& n, int a, const std::string& b)
: Animal(n, a), breed(b) { // 调用基类构造函数
log("Dog created, breed: " + breed); // ✅ 直接调用基类的 protected 函数
}
// 实现纯虚函数
void makeSound() const override {
log("汪汪汪!"); // ✅ 直接调用基类的 protected 函数
}
// 演示直接访问 protected 成员变量
void celebrateBirthday() {
age++; // ✅ 直接访问和修改基类的 protected 成员变量
log("生日快乐!现在 " + std::to_string(age) + " 岁了!");
}
// 新增方法
void fetch() const {
log("正在捡球!");
}
};
int main() {
Dog dog("旺财", 3, "金毛");
// 通过公共接口与对象交互
dog.makeSound(); // 输出: [旺财]: 汪汪汪!
dog.celebrateBirthday(); // 输出: [旺财]: 生日快乐!现在 4 岁了!
dog.fetch(); // 输出: [旺财]: 正在捡球!
// Animal* animal = &dog;
// animal->name = "新名字"; // ❌ 错误!name 是 protected,外部无法访问
// dog.name = "新名字"; // ❌ 错误!即使通过派生类对象,也无法直接访问 protected 成员(在类外部)
return 0;
}
关键点说明
在派生类内部:
Dog 类的成员函数(如 makeSound、celebrateBirthday、构造函数)可以直接使用 name、age 和 log()。
这就像它们是 Dog 类自己的 protected 成员一样。
在类外部:
即使是通过 Dog 类的对象,也不能在 main 函数或其他外部代码中直接访问 name 或调用 log()。
因为 protected 成员对“外界”仍然是隐藏的。dog.name = "新名字"; 是编译错误。
public 继承的作用:
public 继承确保了 Animal 的 public 接口(如 makeSound)对 Dog 的使用者也是 public 的。
它不影响 protected 成员在派生类内部的可访问性。无论 public、protected 还是 private 继承,派生类内部都能访问基类的 protected 成员。
总结
问题 答案
派生类能否直接访问基类的 protected 成员? 是的,完全可以。
访问发生在哪里? 只能在派生类的成员函数内部。
外部代码能否通过派生类对象访问? 不能。 protected 成员对外部是隐藏的。
继承方式(public/protected/private)有影响吗? 没有。 无论哪种继承方式,派生类内部都能访问基类的 protected 成员。
protected 是专门为继承设计的访问级别,它允许派生类复用和扩展基类的实现,同时保持对其他外部代码的封装。这是实现代码复用和构建类层次结构的关键机制。
C++继承中protected成员访问解析

被折叠的 条评论
为什么被折叠?



