English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ 다중, 다중 상속, 계층 상속

이 문서에서는 C를 배웁니다 ++프로그래밍에서의 다양한 상속 모델: 예제와 함께 다중 상속, 다중 상속, 계층 상속.

상속이는 객체 지향 프로그래밍 언어의 핵심 기능 중 하나입니다. 소프트웨어 개발자는 기존 클래스에서 새로운 클래스를 파생할 수 있습니다. 파생 클래스는 기본 클래스(기존 클래스)의 기능을 상속받습니다.

C ++프로그래밍에는 여러 상속 모델이 있습니다.

C ++다중 상속

C ++프로그래밍에서는 단순히 기본 클래스에서 클래스를 파생할 뿐만 아니라, 파생 클래스에서 또 다른 클래스를 파생할 수도 있습니다. 이 상속 형식은 다중 상속으로 불립니다.

class A
{ 
... .. ... 
};
class B: public A
{
... .. ...
};
class C: public B
{
... ... ...
};

이곳에서, 클래스 B는 기본 클래스 A에서 파생되고, 클래스 C는 파생 클래스 B에서 파생됩니다.

예제1:C ++다중 상속

#include <iostream>
using namespace std;
class A
{
    public:
      void display()
      {
          cout << "기본 클래스의 내용.";
      }
};
class B : public A
{
};
class C : public B
{
 
};
int main()
{
    C obj;
    obj.display();
    return 0;
}

출력 결과

기본 클래스의 내용.

이 프로그램에서, C 클래스는 B 클래스에서 파생되었습니다(B 클래스는 기본 클래스 A에서 파생되었습니다).

C 클래스의 obj 객체는 main() 함수에서 정의됩니다.

display() 함수를 호출할 때, 클래스 A에서의 display()를 실행합니다. 이는 클래스 C와 B에 display() 함수가 없기 때문입니다.

컴파일러는 먼저 클래스 C에서 display() 함수를 찾습니다. 이 함수가 해당 클래스에서 존재하지 않기 때문에, 함수는 클래스 B에서 찾습니다(클래스 C는 B에서 파생되기 때문입니다).

这个display()函数在B类中也不存在,所以编译器在A类中寻找它(因为B是从A派生出来的)。

C에서 display() 함수가 있으면, 컴파일러는 클래스 A의 display()를 덮어씁니다(이는 B 클래스에서도 display() 함수가 없기 때문입니다, 따라서 컴파일러는 A 클래스에서 그것을 찾습니다, B는 A에서 파생되었기 때문입니다).멤버 함수 오버라이드)

C ++다중 继承

C ++프로그래밍에서, 한 클래스는 여러 부모 클래스에서 파생될 수 있습니다. 예를 들어: Bat 클래스는 Mammal과 WingedAnimal 기본 클래스에서 파생됩니다. 이는 매우 의미가 있으며,Batman은 포유动物(Mammal)이며 날개를 가진 동물(WingedAnimal)입니다.

예제2:C ++프로그래밍에서의 다중 继承

#include <iostream>
using namespace std;
class Mammal {
  public:
    Mammal()
    {
      cout << "哺乳动物可以直接出生。" << endl;
    }
};
class WingedAnimal {
  public:
    WingedAnimal()
    {
      cout << "날개를 가진 동물은 날을 날 수 있습니다." << endl;
    }
};
class Bat : public Mammal, public WingedAnimal {
};
int main()
{
    Bat b1;
    return 0;
}

출력 결과

哺乳动物可以直接出生.
날개를 가진 동물은 날을 날 수 있습니다.

다중 상속에서의 모호성

다중 继承의 가장 명확한 문제는 함수 재정의 시기에 발생합니다.

두 개의 기본 클래스가 동일한 함수를 가지고 있지만, 이 함수를 재정의하지 않은 파생 클래스가 있다고 가정해 봅시다.

기본 클래스의 객체를 사용하여 이 함수를 호출하려고 시도하면, 컴파일러는 오류를 표시합니다. 이는 컴파일러가 호출할 함수를 알 수 없기 때문입니다. 예를 들어:

class base1
{
  public:
     void someFunction( )
     { .... ... .... }  
};
class base2
{
    void someFunction( )
     { .... ... .... } 
};
class derived : public base1, public base2
{
    
};
int main()
{
    derived obj;
    obj.someFunction() // 에러!  
}

이 문제는 범위 해석 함수를 사용하여 base에 속하는 함수를 지정할 수 있습니다.1또는 base2을 통해 문제를 해결

int main()
{
    obj.base1::someFunction( );  // base 호출1클래스 함수
    obj.base2::someFunction();   // base 호출2클래스 함수
}

C ++分层繼承

기본 클래스에서 여러 클래스를 继承하는 경우, 이를 분할繼承이라고 합니다. 분할繼承에서는, 자식 클래스에서 공통된 모든 기능이 기본 클래스에 포함됩니다.

예를 들어: 물리학, 화학, 생물학 모두 과학과에서 비롯됩니다.

分层繼承의 문법

class base_class {
     ... .. ...
}
class first_derived_class: public base_class {
     ... .. ...
}
class second_derived_class: public base_class {
     ... .. ...
}
class third_derived_class: public base_class {
     ... .. ...
}