📜  C++中Containership和继承的区别(1)

📅  最后修改于: 2023-12-03 15:29:53.237000             🧑  作者: Mango

C++中Containership和继承的区别

在C++中,Containership和继承是两种不同的代码重用机制。有时候这两者之间的差异可能会令人感到困惑。因此,在本文中,我们将探讨Containership和继承的区别,以及在何种情况下应该使用它们。

继承

继承是面向对象编程中最基本的概念之一。它允许程序员定义一个新类,该类从现有类继承其数据和函数成员。这个新类被称为派生类,现有类被称为基类。派生类可以访问基类的所有公有和保护成员。

下面是一个简单的继承示例:

class Shape {
public:
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
protected:
    int width;
    int height;
};

class Rectangle: public Shape {
public:
    int getArea() {
        return (width * height);
    }
};

在这个示例中,我们定义了两个类:Shape和Rectangle。Rectangle是一个派生类,它从Shape继承了宽和高数据成员以及setWidth和setHeight函数成员。

Containership

Containership是另一种代码重用机制,它允许程序员在类中使用其他类对象。它被称为Containership,因为使用的类是容器类,用于容纳另一个类的对象。容器类可以访问其成员对象的公有和保护成员。

下面是一个简单的Containership示例:

class Rectangle {
public:
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
    int getArea() {
        return (width * height);
    }
private:
    int width;
    int height;
};

class Square {
public:
    void setSide(int s) {
        side = s;
    }
    int getArea() {
        return (side * side);
    }
private:
    int side;
};

class SquareInRectangle {
public:
    void setWidth(int w) {
        rect.setWidth(w);
        square.setSide(w);
    }
    void setHeight(int h) {
        rect.setHeight(h);
        square.setSide(h);
    }
    int getArea() {
        return (rect.getArea() - square.getArea());
    }
private:
    Rectangle rect;
    Square square;
};

在这个示例中,我们定义了三个类:Rectangle,Square和SquareInRectangle。SquareInRectangle是一个容器类,它包含一个Rectangle对象和一个Square对象。它使用Rectangle对象的宽和高来设置Square对象的边长,并计算出SquareInRectangle对象的面积。

区别

继承和Containership之间的主要区别在于,继承是定义一个新类,并将现有类的成员包含在其中,而Containership是将一个类的对象包括在另一个类中。

不同之处在于继承建立了一种代码层次结构,派生类包含了基类的所有成员,而Containership只是将一个类的对象包含在另一个类中。在Containership中,容器类和成员对象之间没有明显的继承关系。此外,使用继承时,可以覆盖基类成员函数,而Containership中则不可能。

总结

以上便是Containership和继承的区别。应该使用继承还是Containership取决于代码设计和问题领域。如果需要再次利用现有类的成员,则应该使用继承。如果需要将一个类的对象包含在另一个类中,则应该使用Containership。