C++ 상속
객체 지향 프로그래밍에서 가장 중요한 개념 중 하나는 상속입니다. 상속을 사용하면 다른 클래스를 기반으로 클래스를 정의할 수 있으므로 애플리케이션을 더 쉽게 만들고 유지 관리할 수 있습니다. 이는 또한 코드 기능을 재사용하고 실행 시간을 향상시키는 효과를 얻습니다.
클래스를 생성할 때 새 데이터 멤버와 멤버 함수를 다시 작성할 필요가 없으며 새 클래스가 기존 클래스의 멤버를 상속하도록 지정하기만 하면 됩니다. 이 기존 클래스를 기본 클래스라고 하고 새 클래스를 파생 클래스라고 합니다.
상속은 is 관계를 나타냅니다. 예를 들어, 포유류는 동물이고 개는 포유류이므로 개는 동물입니다.
클래스는 여러 클래스에서 파생될 수 있습니다. 즉, 여러 기본 클래스에서 데이터와 함수를 상속받을 수 있습니다. 파생 클래스를 정의하려면 클래스 파생 목록을 사용하여 기본 클래스를 지정합니다. 클래스 파생 목록은 하나 이상의 기본 클래스 이름을 따서 명명되고 다음 형식을 갖습니다.
class derived-class: access-specifier base-class
여기서 액세스 한정자 access-specifier는 public, protected 또는 private 중 하나이고 base-class는 이전에 정의된 것입니다. 수업의 이름입니다. 액세스 지정자를 사용하지 않는 경우 기본값은 비공개입니다.
기본 클래스 Shape가 있다고 가정하고, Rectangle은 아래와 같이 파생 클래스입니다.
#include <iostream>
using namespace std;
// 基类
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);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Total area: 35
파생 클래스는 기본 클래스의 비공개 멤버가 아닌 모든 멤버에 액세스할 수 있습니다. 따라서 파생 클래스의 멤버 함수에서 기본 클래스 멤버에 액세스하지 않으려면 기본 클래스에서 private으로 선언해야 합니다.
다음과 같이 액세스 권한에 따라 다양한 액세스 유형을 요약할 수 있습니다.
파생 클래스 | yes | yes | no |
외부 클래스 | yes | no | no |
파생 클래스는 다음 경우를 제외하고 모든 기본 클래스 메서드를 상속합니다.
클래스가 기본 클래스에서 파생되면 기본 클래스는 public, protected 또는 private로 상속될 수 있습니다. 상속된 유형은 위에서 설명한 액세스 지정자를 통해 지정됩니다.
우리는 protected 또는 private 상속을 거의 사용하지 않으며 일반적으로 public 상속을 사용합니다. 다양한 유형의 상속을 사용하는 경우 다음 규칙을 따르세요.
공개 상속(공개): 클래스가 public 기본 클래스에서 파생되면 기본 클래스의 public 멤버도 of입니다. 파생 클래스 Public 멤버, protected 기본 클래스 멤버도 protected 파생 클래스 멤버, private 기본 클래스 멤버는 파생 클래스에서 직접 액세스할 수 없지만 public 및 protected 기본 클래스 액세스 멤버입니다.
보호 상속: 클래스가 protected 기본 클래스에서 파생되면 기본 클래스의 public 및 protected 멤버가 파생 클래스의 protected 멤버가 됩니다.
개인 상속(개인): 클래스가 private기본 클래스에서 파생되면 기본 클래스의 public 및 protected 멤버가 파생 클래스의 private 멤버가 됩니다.
다중 상속은 하위 클래스가 여러 부모 클래스를 가질 수 있으며 여러 부모 클래스의 특성을 상속한다는 의미입니다.
C++ 클래스는 여러 클래스에서 멤버를 상속할 수 있습니다. 구문은 다음과 같습니다.
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
그 중 액세스 수정자 상속 방법은 public, protected 또는 private 중 하나이며 각 기본 클래스를 수정하는 데 사용됩니다. 위와 같이 쉼표로 구분하세요. 이제 다음 예를 살펴보겠습니다.
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Total area: 35
Total paint cost: 50
|