基类中的私有成员,在保护派生类中不可直接访问
时间: 2024-05-31 16:11:00 浏览: 286
在C++中,基类的私有成员只能被基类的成员函数访问,派生类无法直接访问基类的私有成员。但是,派生类可以通过调用基类的公有和保护成员函数来间接访问基类的私有成员。这是因为保护成员可以被派生类的成员函数访问,而公有成员可以被任何函数访问。因此,如果派生类需要访问基类的私有成员变量,可以通过在基类中提供公有或保护的访问函数来实现。
相关问题
下列说法中错误的是( )。 A. 私有继承时基类中的public成员在派生类中是private的 B. 公有继承时基类中的private成员在派生类中是不可访问的 C. 公有继承时基类中的public成员在派生类中是public的 D. 私有继承时基类中的public成员在派生类中是protected的
A. 私有继承时基类中的 public 成员在派生类中是 private 的,这个说法是正确的。但是选项中要求找出错误的说法,因此选项 A 不是本题的正确答案。
正确答案应该是 D. 私有继承时基类中的 public 成员在派生类中是 protected 的。私有继承是一种访问控制方式,它让基类的公有成员和保护成员在派生类中变成了私有成员,不能被外部访问,只能在派生类的内部访问。私有继承的语法格式为:
```c++
class Derived : private Base {
// ...
};
```
在私有继承中,基类中的 public 成员和保护成员都会变成派生类的私有成员,不能被外部访问,只能在派生类的内部访问。例如:
```c++
class Base {
public:
int m_public; // 公有成员
protected:
int m_protected; // 保护成员
private:
int m_private; // 私有成员
};
class Derived : private Base {
public:
void foo() {
m_public = 1; // 派生类中可以访问基类的公有成员
m_protected = 2; // 派生类中可以访问基类的保护成员
// m_private = 3; // 错误:不能访问基类的私有成员
}
};
int main() {
Derived d;
// d.m_public = 1; // 错误:不能访问基类的公有成员
// d.m_protected = 2; // 错误:不能访问基类的保护成员
// d.m_private = 3; // 错误:不能访问基类的私有成员
return 0;
}
```
在上面的例子中,定义了一个 `Base` 基类和一个 `Derived` 派生类。`Derived` 类使用私有继承方式继承了 `Base` 类。在 `Derived` 类中,可以访问基类的公有成员和保护成员,但是不能访问基类的私有成员。在 `main()` 函数中,不能访问派生类中继承自基类的公有成员和保护成员。
员都被派生类继承下来之后变成私有成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象不能访问派生类继承基类的公有成员,保护成员和私有成员。class Child : private Base
### C++ 中派生类继承基类成员的访问权限规则
#### 公有继承 (Public Inheritance)
当使用 `public` 方式继承时:
- **公有成员**:在派生类中保持为公有,可以通过派生类对象访问[^1]。
- **保护成员**:在派生类中仍为保护成员,可以在派生类内部访问,但不能通过派生类对象访问[^2]。
- **私有成员**:不会成为派生类的一部分,即不可见也不可访问。尽管这些成员存在于派生类实例中,但从逻辑上它们是隐藏的[^4]。
```cpp
class Base {
public:
int publicData;
protected:
int protectedData;
private:
int privateData; // 不可见于派生类
};
class Derived : public Base {
public:
void access() {
this->publicData = 0; // 可以访问
this->protectedData = 0; // 可以访问
// this->privateData = 0; // 编译错误,无法访问
}
};
```
#### 保护继承 (Protected Inheritance)
采用 `protected` 继承模式下:
- **公有成员**:变为受保护成员,在派生类内可用,但对外部封闭。
- **保护成员**:同样作为保护成员处理,仅限派生类及其子类访问。
- **私有成员**:依旧不公开给派生类,遵循同样的不可达原则。
```cpp
class DerivedProtected : protected Base {
public:
void access() {
this->publicData = 0; // 转化为保护成员,可以访问
this->protectedData = 0; // 同样转化为保护成员,可以访问
// this->privateData = 0; // 错误,依然无法触及
}
};
```
#### 私有继承 (Private Inheritance)
对于 `private` 类型的继承而言:
- **公有成员**:转变为私有成员,只有派生类本身能操作,其他地方均无权干涉。
- **保护成员**:也变成私有的状态,除了派生类自己外不允许外界接触。
- **私有成员**:继续维持其原始特性——完全隔离的状态。
```cpp
class DerivedPrivate : private Base {
public:
void access() {
this->publicData = 0; // 成为私有成员,只能在此处修改
this->protectedData = 0; // 同理转成私有成员,只允许在这里调整
// this->privateData = 0; // 即使如此也无法改变这一事实
}
friend class FriendClass; // 特殊情况下可通过友元机制间接获取某些权限
};
```
总结来说,不同类型的继承决定了如何转换来自父级组件属性的可见度级别,并最终影响到哪些部分能够被后代所利用或看见。理解这一点有助于设计更加合理且安全的面向对象结构。
阅读全文
相关推荐















