私有继承派生类定义与使用、
时间: 2023-12-10 15:05:09 浏览: 87
下面是一个私有继承派生类的定义和使用示例:
```c++
// 父类
class Parent {
public:
void print() {
std::cout << "I am parent." << std::endl;
}
};
// 子类
class Child : private Parent {
public:
void callParentPrint() {
print(); // 子类内部可以访问父类的成员函数
}
};
int main() {
Child child;
child.callParentPrint(); // 输出 "I am parent."
// child.print(); // 编译错误,无法在外部访问父类的成员函数
return 0;
}
```
在上面的示例中,子类`Child`使用私有继承方式派生自父类`Parent`,子类内部可以访问父类的公共成员函数`print()`,但无法在外部直接访问。在`main()`函数中,通过创建子类对象`child`,并调用其成员函数`callParentPrint()`,实现了对父类成员函数`print()`的间接访问。
需要注意的是,在私有继承派生类中,父类的公共成员和保护成员都会变成子类的私有成员,无法在外部直接访问。因此,子类只能在自身内部或者友元函数中访问父类的成员函数和成员变量。
相关问题
定义类B1,B2,B3,定义派生类A;派生类继承顺序是:公有继承B2,公有继承B1,定义B3的对象bb作为派生类的私有数据成员,定义派生类对象aa,输出结果
在C++中,如果你定义了一个基类序列如B1、B2和B3,以及一个派生类A,其继承关系可以按照你的描述设置为:
```cpp
class B1 {
public:
// B1的公共成员和方法...
};
class B2 : public B1 { // 公共继承B1
public:
// B2的公共成员和方法...
};
class B3 {
private:
B3* bb; // 私有数据成员,指向B3对象
public:
// B3的公共成员和方法...
};
class A : public B2 { // 公有继承B2,再通过B2继承B1
private:
B3 bb; // 派生类A的私有变量,直接存储B3对象
public:
// A的公共成员和方法...
};
int main() {
A aa; // 创建A对象
// 输出aa.bb,由于bb是A类的私有数据成员,需要通过aa来访问
if (aa.bb != nullptr) {
// 输出bb的相关信息...
std::cout << "bb: " << aa.bb->(*some_method_in_B3()) << std::endl;
}
return 0;
}
```
在这个例子中,`aa.bb`是一个`B3`类型的对象,并且它是`A`类的一个私有成员。当你尝试访问这个`bb`时,你需要通过`aa`对象来进行。
下面描述中,错误的是( )。 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` 的对象,并进行访问。
阅读全文