C++私有继承(一)
C++中的继承分为三种类型:公有继承、保护继承和私有继承。本文主要介绍C++中的私有继承及其相关内容。
1. 什么是私有继承
在C++中,私有继承是一种继承方式,它使得子类只能访问父类中的公有成员和受保护成员,而不能访问父类的私有成员。私有继承表示的是 is-implemented-in-terms-of(以... 为基础实现),即子类中的成员函数可以调用父类的公有和受保护函数,但不能访问父类的私有函数。
私有继承的语法形式如下:
class Child: private Parent {
// Derived class members
}
其中,Parent表示父类,Child表示子类,private表示继承类型,表示采用私有继承。
2. 私有继承的特点
- 父类的公有和受保护成员在子类中仍然是公有和受保护的。
- 父类的私有成员在子类中变成了私有的,不能被子类直接访问。
- 私有继承导致子类无法访问父类的私有成员,但不影响子类继续使用父类的公有和受保护成员,避免了代码的冗余和重复,能够更加方便地实现对象的复用。
下面是一个私有继承的实例:
#include <iostream>
using namespace std;
class Base {
public:
int i;
protected:
int j;
private:
int k;
};
class Derived: private Base {
public:
void set(int x, int y, int z) {
i = x;
j = y;
// k = z; // 无法使用Base类的private成员变量k
}
void show() {
cout << i << ", " << j << endl;
}
};
int main() {
Derived obj;
obj.set(1, 2, 3);
obj.show();
// obj.k = 4; // 无法使用Base类的private成员变量k
return 0;
}
在这个实例中,Base是父类,Derived是子类。Derived类使用私有继承继承了Base类。
3. 私有继承的使用场景
私有继承通常用于实现类的接口继承,即通过继承,使得子类具备和父类相同的外部接口(即公有成员函数),但往往并不需要继承父类的内部实现(私有成员和受保护成员)。
例如,当我们定义一个新的类时,可以选择继承现有的类,从而减少代码量,并使得代码更加简洁清晰。但往往不需要继承现有类的全部功能,只需要继承其中的一部分公有接口,而不需要继承私有和受保护成员。此时就可以使用私有继承。
下面是一个使用私有继承实现类的接口继承的实例:
#include <iostream>
using namespace std;
class Shape {
public:
virtual double getArea() = 0;
};
class Rectangle: public Shape {
public:
Rectangle(double w, double h) {
width = w;
height = h;
}
virtual double getArea() {
return width * height;
}
private:
double width;
double height;
};
class Square: private Rectangle {
public:
Square(double side): Rectangle(side, side) {}
double getArea() {
return Rectangle::getArea(); // 继承Rectangle类的getArea()方法
}
};
int main() {
Square obj(4.0);
cout << "Area of the square is " << obj.getArea() << endl; // 输出Area of the square is 16
return 0;
}
在这个实例中,Shape是一个抽象类,Rectangle是继承Shape类的子类,并实现了Shape类中的纯虚函数getArea()。Square是继承Rectangle类的子类,由于私有继承,无法访问Rectangle类的公有成员,因此需要在Square类中实现getArea()函数,并调用Rectangle类的getArea()函数获取面积。
4. 总结
私有继承是C++中三种继承方式之一,它使得子类只能访问父类中的公有和受保护成员,而不能访问父类的私有成员。私有继承通常用于实现类的接口继承,即通过继承,使得子类具备和父类相同的外部接口,但往往不需要继承父类的内部实现。
