基类中的私有成员,在保护派生类中不可直接访问
时间: 2024-05-31 18:11:00 浏览: 27
在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()` 函数中,不能访问派生类中继承自基类的公有成员和保护成员。
下面描述中,错误的是( )。 A. 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问 B. 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问 C. 在派生类中不可见的成员要变成可访问的,需要进行访问声明 D. 在基类定义的public和protected成员在保护继承的派生类中可见
A. 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问是错误的。
在私有继承中,基类的公有和保护成员都被继承到了派生类中,但是它们在派生类中是私有的,不能被类外访问。因此,选项 A 描述是错误的。
其他选项是正确的:
- 在公有继承中,基类的公有成员在派生类中仍然是公有的,可以被类外访问;保护成员在派生类中变成了保护的,不能被类外访问。
- 在保护继承中,基类的公有和保护成员在派生类中都变成了保护的,不能被类外访问。
- 如果派生类中要访问基类中不可见的成员,需要使用访问声明来进行声明。例如,在派生类中声明 `using Base::foo;`,即可将基类中的 `foo` 成员变成派生类中可见的成员。
例如:
```c++
class Base {
public:
void foo() { cout << "Base::foo()" << endl; }
protected:
void bar() { cout << "Base::bar()" << endl; }
};
class Derived1 : public Base {
public:
void test() {
foo(); // 可以访问基类的公有成员
// bar(); // 错误:不能访问基类的保护成员
}
};
class Derived2 : protected Base {
public:
using Base::foo; // 将基类的 foo 成员变成 Derived2 的公有成员
};
int main() {
Derived1 d1;
// d1.foo(); // 错误:不能访问基类的公有成员
// d1.bar(); // 错误:不能访问基类的保护成员
Derived2 d2;
d2.foo(); // 可以访问基类的公有成员
// d2.bar(); // 错误:不能访问基类的保护成员
return 0;
}
```
在上面的例子中,定义了一个 `Base` 基类和两个派生类 `Derived1` 和 `Derived2`。在 `Derived1` 中使用了公有继承,`Derived2` 中使用了保护继承。在 `Derived1` 中,可以访问基类的公有成员,但是不能访问基类的保护成员;在 `Derived2` 中,使用访问声明将基类的 `foo` 成员变成了公有成员,因此可以访问。在 `main()` 函数中,分别创建了 `Derived1` 和 `Derived2` 的对象,并进行访问。
相关推荐
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)