欢迎访问宙启技术站
智能推送

C++私有继承(一)

发布时间:2023-05-15 20:49:29

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++中三种继承方式之一,它使得子类只能访问父类中的公有和受保护成员,而不能访问父类的私有成员。私有继承通常用于实现类的接口继承,即通过继承,使得子类具备和父类相同的外部接口,但往往不需要继承父类的内部实现。